当前位置: 首页 > 知识库问答 >
问题:

从FragmentTabHost的子片段中添加新的选项菜单到外部片段中

周意智
2023-03-14
 i. ChildFragment1.java(extends SherlockFragment)

 ii. ChildFragment2.java(extends SherlockFragment)

 iii. ChildFragment3.java(extends SherlockFragment)

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

共有1个答案

东方明亮
2023-03-14

现在,我可以调用子片段的onCreateOptionsMenu,也可以通过以下代码调用onOptionsItemSelected。

碎片2.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);
}
@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;
}
 类似资料:
  • 我想将数据从父片段传递到选项卡式片段(子片段),以便传递初始数据(当父片段第一次加载时),我使用了Bundle数据。当在子片段的嵌套片段中时,我调用PopbackStack(),以便通过单击按钮返回。在那里,我需要更新之前传递到子选项卡片段的捆绑数据。捆绑数据不会得到更新的数据集 父片段-初始状态 子片段-Tab片段 孩子- 我错过了什么?请帮忙

  • 我碰到了一些我不明白的事情。 有人知道为什么这不起作用吗? 谢谢你的帮助。

  • 我有一个工具栏和一个导航抽屉。当我启动应用程序时,会创建工具栏和导航抽屉。当我单击导航抽屉中的项目时,它会启动新的片段并保留相同的工具栏。当我启动特定片段时,我基本上如何向工具栏添加菜单项,例如搜索、添加、编辑?我不希望在程序开始时使用它们,而是动态创建的。还有,我怎样才能点击这些按钮,让它们启动其他片段呢。我希望在一个片段中,与另一个片段中的编辑按钮相比,工具栏中的编辑按钮可以做特定的事情。谢谢

  • 和我的框架XML 有什么想法吗?我试图将progressBar放在WebView的“前面”,但是当页面被加载时,图标并没有消失...

  • 我有一个,它创建一个,然后这个创建另一个: 这让我想到。是否真的可以删除并转到? 提前感谢您的时间,我在网上找不到任何合适的信息!

  • 在我的应用程序中,我有一个活动,其中包含一个FrameLayout。在这个FrameLayout中,有一个片段,包含一个ToolBar和一个RecyclView。 在这个工具栏中,我有一个搜索按钮,它应该在项目单击时启动活动。但是,当我尝试使用onOptionsItemSelected时,应用程序会成功构建和安装,但当我尝试点击该按钮时,什么也没发生。Logcat也没有说什么。 能告诉我我做错了什