有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java从外部片段内FragmentTabHost的子片段添加新选项菜单

当我为我的应用程序使用一些嵌套片段时,应用程序的子片段无法通过重写onCreateOptions菜单(menu menu,MenuInflater MenuInflater)方法来添加新的选项菜单(从不点击此方法)

应用程序的类层次结构如下所示

主要活动。java(扩展SherlockFragmentActivity) (MainActivity包括以下子片段)

  1. 碎片1。java(扩展SherlockFragment)

  2. 碎片2。java(扩展SherlockFragment)

(Fragment2包括FragmentTabHost,用于添加以下子片段)

 i. ChildFragment1.java(extends SherlockFragment)

 ii. ChildFragment2.java(extends SherlockFragment)

 iii. ChildFragment3.java(extends SherlockFragment)

我可以通过在onCreate(Bundle savedInstanceState)和 通过覆盖OnCreateOptions菜单(菜单菜单,菜单展开器菜单展开器)

但是我不能在ChildFragment1、ChildFragment2、ChildFragment3中添加新的OptionMenu,因为从未调用子片段类的onCreateOptions菜单(Menu菜单,MenuInflater MenuInflater)方法


共 (2) 个答案

  1. # 1 楼答案

    您必须手动调用该方法。在您的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中找到了解决方案

  2. # 2 楼答案

    现在我可以调用子片段的onCreateOptions菜单,也可以调用以下代码选择的onOptions项

    碎片2。爪哇

    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。爪哇

    abstract class BaseTabsPagerChildFragment extends BaseSherlockFragment {
        public abstract void inflateOptionsMenu(Menu menu, MenuInflater menuInflater);
    }
    

    儿童碎片1。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;
    }
    

    谢谢