从外部片段内的 FragmentTabHost 的子片段添加新的选项菜单
Posted
技术标签:
【中文标题】从外部片段内的 FragmentTabHost 的子片段添加新的选项菜单【英文标题】:Add new option menu from child fragment of FragmentTabHost inside outer fragment 【发布时间】:2015-05-23 17:29:09 【问题描述】:当我为我的应用程序使用一些嵌套片段时,应用程序的子片段无法通过覆盖 onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) 方法添加新的选项菜单(从不使用此方法)。
应用程序的类层次结构如下。
MainActivity.java(扩展 SherlockFragmentActivity) (MainActivity包括以下子片段)
Fragment1.java(扩展 SherlockFragment)
Fragment2.java(扩展 SherlockFragment)
(Fragment2 包含 FragmentTabHost 用于添加以下子片段)
i. ChildFragment1.java(extends SherlockFragment)
ii. ChildFragment2.java(extends SherlockFragment)
iii. ChildFragment3.java(extends SherlockFragment)
我可以通过在 onCreate(Bundle savedInstanceState) 中添加 setHasOptionsMenu(true) 和 通过覆盖 onCreateOptionsMenu(Menu menu, MenuInflater menuInflater)
但我无法在 ChildFragment1、ChildFragment2、ChildFragment3 中添加新的 OptionMenu,因为永远不会调用子片段类的 onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) 方法。
【问题讨论】:
【参考方案1】:现在我可以调用子片段的onCreateOptionsMenu,也可以通过以下代码调用onOptionsItemSelected。
Fragment2.java
protected FragmentTabHost mTabHost;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater menuInflater)
super.onCreateOptionsMenu(menu, menuInflater);
Fragment currentFragment = getChildFragmentManager().findFragmentByTag(mTabHost.getCurrentTabTag());
if (currentFragment != null && currentFragment instanceof BaseTabsPagerChildFragment)
((BaseTabsPagerChildFragment) currentFragment).inflateOptionsMenu(menu, menuInflater);
@Override
public boolean onOptionsItemSelected(MenuItem item)
if (super.onOptionsItemSelected(item))
return true;
else
Fragment currentFragment = getChildFragmentManager().findFragmentByTag(mTabHost.getCurrentTabTag());
if (currentFragment != null && currentFragment instanceof BaseTabsPagerChildFragment)
return ((BaseTabsPagerChildFragment) currentFragment).onOptionsItemSelected(item);
return false;
BaseTabsPagerChildFragment.java
abstract class BaseTabsPagerChildFragment extends BaseSherlockFragment
public abstract void inflateOptionsMenu(Menu menu, MenuInflater menuInflater);
ChildFragment1.java(扩展 BaseTabsPagerChildFragment.java)
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
;
@Override
public void inflateOptionsMenu(Menu menu, MenuInflater menuInflater)
onCreateOptionsMenu(menu, menuInflater);
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater menuInflater)
super.onCreateOptionsMenu(menu, menuInflater);
menuInflater.inflate(R.menu.message_actionbar_menu, menu);
@Override
public boolean onOptionsItemSelected(MenuItem item)
boolean handled = super.onOptionsItemSelected(item);
if (handled)
return true;
int itemId_ = item.getItemId();
if (itemId_ == R.id.menu_item_compose)
launchCompose();
return true;
if (itemId_ == R.id.menu_item_delete)
doDelete();
return true;
return false;
谢谢。
【讨论】:
【参考方案2】:您必须手动调用该方法。在您的Fragment2
中执行以下操作
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
super.onCreateOptionsMenu(menu, inflater);
ChildFragment frag = (ChildFragment) getChildFragmentManager().findFragmentBy...;
if (frag != null) frag.inflateOptionsMenu(menu, new MenuInflater(mActivity));
在你的ChildFragment
然后有
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
public void inflateOptionsMenu(Menu menu, MenuInflater inflater)
onCreateOptionsMenu(menu, inflater);
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.deal_detaisl, menu);
我在chat 和this question 之后找到了解决方案。
【讨论】:
感谢您的回答。这个解决方案可以调用子fragment(ChildFragment1, ChildFragment2, ChildFragment3)的onCreateOptionsMenu(Menu menu, MenuInflater inflater),但是当我们点击optionItem时不能调用子fragment的onOptionsItemSelected(MenuItem item)。以上是关于从外部片段内的 FragmentTabHost 的子片段添加新的选项菜单的主要内容,如果未能解决你的问题,请参考以下文章
FragmentTabHost Horizontal Scrollview + Swipe Android