Android工具栏为不同的片段添加菜单项

Joe*_*igi 73 android android-fragments android-toolbar

我有一个工具栏和一个导航抽屉.当我启动我的应用程序时,会创建工具栏和导航抽屉.当我单击导航抽屉中的项目时,它会启动新的片段并保留相同的工具栏.当我启动特定片段时,如何将菜单项添加到工具栏中,例如搜索,添加,编辑?我不希望它们在程序的开头,但是动态创建.此外,我如何能够单击这些按钮并让它们启动其他片段.我希望它在一个片段中,与另一个片段中的编辑按钮相比,工具栏中的编辑按钮执行特定的操作.谢谢!

Menu_toolbar:

<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">

<item android:id="@+id/edit"
    android:orderInCategory="1"
    android:title="Edit"
    app:showAsAction="always"
    android:icon="@drawable/pencil_icon"/>
<item android:id="@+id/add"
    android:orderInCategory="1"
    android:title="Add"
    app:showAsAction="always"
    android:icon="@drawable/plus_icon"/>
Run Code Online (Sandbox Code Playgroud)

工具栏:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="55dp"
android:background="#10a1ff"
android:title="Home"
/>
Run Code Online (Sandbox Code Playgroud)

Gun*_*gar 136

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState)
{
    View v = inflater.inflate(R.layout.library_fragment, parent, false);
    setHasOptionsMenu(true);
    return v;
}


@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
   inflater.inflate(R.menu.your_menu_xml, menu);
   super.onCreateOptionsMenu(menu, inflater);
}
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的答案,因为对片段中调用的onCreateOptionsMenu方法需要调用setHasOptionsMenu(true). (15认同)
  • 记得在`onCreateOptionsMenu`中调用`menu.clear()` - 否则你也将继承父母的菜单. (9认同)

All*_*han 31

这是动态创建菜单的方法:http: //www.101apps.co.za/index.php/articles/using-toolbars-in-your-apps.html

编辑:

Toolbar actionBarToolBar = (Toolbar) findViewById(R.id.my_toobar);
setSupportActionBar(actionBarToolBar);
actionBarToolBar.setNavigationIcon(R.drawable.icon);
actionBarToolBar.setNavigationContextDescription(getResources().getString(R.string.desc);
actionBarToolBar.setLogo(R.drawable.other_icon);
actionBarToolBar.setLogoDescription(getResources().getString(R.string.other_desc);
actionBarToolBar.inflateMenu(R.menu.fragment_menu);
Run Code Online (Sandbox Code Playgroud)

  • 使用`actionBarToolbar.setOnMenuItemClickListener()`来处理菜单项操作.在这种情况下,不会调用`onOptionsItemSelected()`. (4认同)
  • 给定的链接不再 (4认同)

Pra*_*pta 20

最好的方法:

1.在Activity中查找工具栏并将其设置为supportActionBar.

Toolbar actionBarToolBar = (Toolbar) findViewById(R.id.my_toobar);
setSupportActionBar(actionBarToolBar);
Run Code Online (Sandbox Code Playgroud)

2.然后,在同一个Activity上处理不同片段的选项菜单将是一块蛋糕.根据需要在每个片段中执行以下操作:

在OnCreateView方法调用中

setHasOptionsMenu(true);
Run Code Online (Sandbox Code Playgroud)

最后,

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.main, menu);
    super.onCreateOptionsMenu(menu, inflater);
}
Run Code Online (Sandbox Code Playgroud)

要管理菜单项单击,我们有onOptionsItemSelected:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_search :
            Log.i("item id ", item.getItemId() + "");
        default:
            return super.onOptionsItemSelected(item);
    }
}
Run Code Online (Sandbox Code Playgroud)


Gui*_*ume 17

最简单的选择是做

toolbar.inflateMenu(R.menu.fragment_menu);
Run Code Online (Sandbox Code Playgroud)

和处理单击菜单项

toolbar.setOnMenuItemClickListener {
    when (it.itemId) {
        R.id.nav_example -> doThat()
    }
    true
}
Run Code Online (Sandbox Code Playgroud)


Ell*_*Zou 8

onCreateOptionsMenu在每个片段中覆盖方法.

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.your_menu_xml, menu);
    super.onCreateOptionsMenu(menu, inflater);
}
Run Code Online (Sandbox Code Playgroud)


小智 6

我正确解决了这个问题。我的解决方案如下代码:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    mRootView = inflater.inflate(R.layout.fragment_order_history, container, false);
    //getActivity().invalidateOptionsMenu();


    setHasOptionsMenu(true);

    return mRootView;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.main, menu);
    super.onCreateOptionsMenu(menu, inflater);
}
Run Code Online (Sandbox Code Playgroud)


Mat*_*lio 5

我遇到了同样的问题,我想根据显示的片段替换工具栏菜单。

我现在面临的问题是菜单被添加到了上一个菜单。

为了仅显示片段的菜单,我建议:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
     menu.clear(); //Empty the old menu
     inflater.inflate(R.menu.menu_fragment1, menu);
     super.onCreateOptionsMenu(menu, inflater);
}
Run Code Online (Sandbox Code Playgroud)

希望它会有所帮助。

  • 在调用 .clear() 之前检查 menu != null (2认同)