Android Fragment使用Toolbar
2016-01-04 14:02
447 查看
链接:http://wuxiaolong.me/2015/12/21/fragmentToolbar/
一般在Activity里使用Toolbar如下:
toolbar.xml
xml调用:
Activity一般写到基类:
Activity调用:
现在项目需求,每个title不一样,就不能像以上一样写一个toolbar,放在最外层。问题来了,Fragment如何使用Toolbar?像上面一样写吗?No,Fragment没有setSupportActionBar,于是Google,得到:
这样就解决Fragment使用Toolbar,却抛出了一个问题:Fragment标题错乱。
当出来这个问题时,我恍然大悟,Fragment里的Toolbar findViewById取的都是MainActivity,include不能共用一个ID,应该加个ID区别一下:
BaseFragment 做相应的修改:
好的,这样标题就没有错乱了,然后又来了新的“需求”:Fragment如何让Toolbar菜单生效?
在activity中:
在Fragment中:
两者不同的地方在于:
1、一个有返回值(boolean类型),一个没有返回值。
2、Fragment中onCreateOptionsMenu的参数多了一个MenuInflater
想让Fragment中的onCreateOptionsMenu生效必须先调用setHasOptionsMenu方法,否则Toolbar没有菜单。
setHasOptionsMenu方法源码如下:
多谢@XZoomEye提示,对于Fragment使用Toolbar思维被局限了,在Android
Toolbar一文中介绍了单独使用而不与ActionBar进行关联,直接使用ToolBar的inflateMenu方法,Menu的事件也是独立的,需要通过设置ToolBar的setOnMenuItemClickListener来实现,这样做就不会发生标题错乱。
Activity使用Toolbar
一般在Activity里使用Toolbar如下:toolbar.xml
1 2 3 4 5 6 7 8 | <?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?attr/colorPrimary" android:minHeight="?actionBarSize"> </android.support.v7.widget.Toolbar> |
1 2 | <include layout="@layout/toolbar" /> |
1 2 3 4 5 6 7 89 | public Toolbar initToolbar(int title) { Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(true); } return toolbar; } public Toolbar initToolbar(CharSequence title) { Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(true); } return toolbar; } |
1 | initToolbar("标题"); |
Fragment使用Toolbar
现在项目需求,每个title不一样,就不能像以上一样写一个toolbar,放在最外层。问题来了,Fragment如何使用Toolbar?像上面一样写吗?No,Fragment没有setSupportActionBar,于是Google,得到:1 2 3 4 5 6 7 89 | public class BaseFragment extends Fragment { Activity mActivity; AppCompatActivity mAppCompatActivity; @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); mActivity = getActivity(); } public Toolbar initToolbar(int title) { AppCompatActivity mAppCompatActivity = (AppCompatActivity) mActivity; Toolbar toolbar = (Toolbar) mAppCompatActivity.findViewById(R.id.toolbar); mAppCompatActivity.setSupportActionBar(toolbar); ActionBar actionBar = mAppCompatActivity.getSupportActionBar(); if (actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(false); } return toolbar; } public Toolbar initToolbar(CharSequence title) { mAppCompatActivity = (AppCompatActivity) mActivity; Toolbar toolbar = (Toolbar) mAppCompatActivity.findViewById(toolbarId); mAppCompatActivity.setSupportActionBar(R.id.toolbar); ActionBar actionBar = mAppCompatActivity.getSupportActionBar(); if (actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(false); } return toolbar; } } |
Fragment标题错乱
当出来这个问题时,我恍然大悟,Fragment里的Toolbar findViewById取的都是MainActivity,include不能共用一个ID,应该加个ID区别一下:1 23 | <include android:id="@+id/program_toolbar" layout="@layout/toolbar" /> |
1 2 3 4 5 6 7 89 | public Toolbar initToolbar(int toolbarId, int title) { AppCompatActivity mAppCompatActivity = (AppCompatActivity) mActivity; Toolbar toolbar = (Toolbar) mAppCompatActivity.findViewById(toolbarId); mAppCompatActivity.setSupportActionBar(toolbar); ActionBar actionBar = mAppCompatActivity.getSupportActionBar(); if (actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(false); actionBar.setDisplayShowTitleEnabled(false); } return toolbar; } |
Fragment让Toolbar菜单生效
在activity中:1 23 | @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return super.onCreateOptionsMenu(menu); } |
1 23 | @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.pictrue_list, menu); super.onCreateOptionsMenu(menu,inflater); } |
1、一个有返回值(boolean类型),一个没有返回值。
2、Fragment中onCreateOptionsMenu的参数多了一个MenuInflater
想让Fragment中的onCreateOptionsMenu生效必须先调用setHasOptionsMenu方法,否则Toolbar没有菜单。
1 2 3 4 5 6 7 89 | public class BaseFragment extends Fragment { Activity mActivity; @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); mActivity = getActivity(); setHasOptionsMenu(true); } } |
1 2 3 4 5 6 7 89 | /** * Report that this fragment would like to participate in populating * the options menu by receiving a call to {@link #onCreateOptionsMenu} * and related methods. * * @param hasMenu If true, the fragment has menu items to contribute. */ public void setHasOptionsMenu(boolean hasMenu) { if (mHasMenu != hasMenu) { mHasMenu = hasMenu; if (isAdded() && !isHidden()) { mHost.onSupportInvalidateOptionsMenu(); } } } |
单独使用而不与ActionBar进行关联
多谢@XZoomEye提示,对于Fragment使用Toolbar思维被局限了,在AndroidToolbar一文中介绍了单独使用而不与ActionBar进行关联,直接使用ToolBar的inflateMenu方法,Menu的事件也是独立的,需要通过设置ToolBar的setOnMenuItemClickListener来实现,这样做就不会发生标题错乱。
相关文章推荐
- android sdk 百度网盘分享
- Android 对象序列化 Serializable实现与Parcelabel实现的区别
- Android 调用相机与图库的简单封装
- Android 不让EditText自动获得焦点
- Android 学习
- android ListView 九大重要属性详细分析
- 在Android 模拟器中安装 apk
- 二十六个月Android学习工作总结【转】
- Android 实现雪花飞舞效果
- Android Studio中隐藏状态栏、标题栏实现全屏的方式
- Android CountDownTimer 倒计时器
- Android端ORM框架——RapidORM
- AndroidStudio快捷键(非复制粘贴)
- Android:Service:服务的生命周期
- Android:Service:实现学生查询
- android-手机软键盘的显示与隐藏
- Android_JSON数据解析
- Android ListView优化总结
- Android锁屏状态下弹出activity,如新版qq的锁屏消息提示
- Android:Service:AIDL实现进程通信