应用中常常会遇到这种需求:
Activity中有不同的Fragment,如MainActivity,二不同的Fragment要求有不同的toolbar,menu。
那么如何自定义Fragment的toolbar呢?
1. 在fragment的xml中添加toolbar;
2. 在fragment的onCreate方法中添加setHasOptionsMenu(true);
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);//加上这句话,menu才会显示出来
}
3. 初始化toolbar.
mToolbarContact = view.findViewById(R.id.tool_bar_contact);
((AppCompatActivity) getActivity()).setSupportActionBar(mToolbarContact);
4.重写onCreateOptionsMenu:
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
//menu.clear();//这句话没用,不必加
inflater.inflate(R.menu.menu_contacts, menu);
super.onCreateOptionsMenu(menu, inflater);
}
5. 重写onOptionsItemSelected:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.menu_add_contact) {
T.showToastBro(getActivity(), item.getTitle().toString());
}
if (id == R.id.menu_nearby_businesses) {
T.showToastBro(getActivity(), item.getTitle().toString());
}
return super.onOptionsItemSelected(item);
}
然后发现fragment的menu和activity的menu重叠。
-
问题出在第3步,要改为:
mToolbarContact = view.findViewById(R.id.tool_bar_contact);
mToolbarContact.inflateMenu(R.menu.menu_contacts);
-
然后发现menu的点击事件不相应。即使已经加了setHasOptionsMenu(true);
第4、5都不用重写,要toolbar代码实现点击事件
mToolbarContact = view.findViewById(R.id.tool_bar_contact);
mToolbarContact.inflateMenu(R.menu.menu_contacts);
mToolbarContact.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
int id = item.getItemId();
if (id == R.id.menu_add_contact) {
T.showToastBro(getActivity(), item.getTitle().toString());
}
if (id == R.id.menu_nearby_businesses) {
T.showToastBro(getActivity(), item.getTitle().toString());
}
return true;
}
});
解决!
扫描二维码关注公众号,回复:
3763979 查看本文章