从外部片段内的 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 Horizo​​ntal Scrollview + Swipe Android

从活动中获取片段内的按钮

如何从片段内的列表视图打开链接网址?

如何通过单击片段内的线性布局从片段类开始新活动?下面是我的代码,但这不起作用

如何从片段外部清除/重置地图?

返回片段后ListView为空