Android工具栏为不同的片段

时间:2015-06-09 01:34:46

标签: 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"/>

工具栏:

<?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"
/>

11 个答案:

答案 0 :(得分:123)

@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);
}

答案 1 :(得分:29)

这是动态创建菜单的方法: 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);

答案 2 :(得分:15)

最好的方法:

<强> 1。在“活动”中查找工具栏并将其设置为supportActionBar。

Toolbar actionBarToolBar = (Toolbar) findViewById(R.id.my_toobar);
setSupportActionBar(actionBarToolBar);

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

在OnCreateView方法调用中

setHasOptionsMenu(true);

最后,

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

要管理菜单项,请点击,我们有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);
    }
}

答案 3 :(得分:7)

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

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

答案 4 :(得分:4)

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

@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);
}

答案 5 :(得分:3)

最简单的选择是做

toolbar.inflateMenu(R.menu.fragment_menu);

答案 6 :(得分:2)

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

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

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

@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);
}

希望它能提供帮助。

答案 7 :(得分:1)

下面是显示带有不同片段的不同菜单选项的步骤。

第一步:调用setHasOptionsMenu(true)

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        setHasOptionsMenu(true)
        super.onViewCreated(view, savedInstanceState)

    }

第2步:为片段相关的选项菜单项充气。

override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) {
    // To clear previously added menu items
    menu?.clear()
    inflater?.inflate(R.menu.your_fragment_menu, menu)
    super.onCreateOptionsMenu(menu, inflater)
}

答案 8 :(得分:0)

在XML内部添加此行

app:menu="@menu/main_menu"

答案 9 :(得分:0)

使用新的MaterialToolbar,很容易创建一个溢出菜单并用于:

<com.google.android.material.appbar.MaterialToolbar
        android:id="@+id/toolbar"
        android:layout_width="0dp"
        android:layout_height="?attr/actionBarSize"
        app:navigationIcon="@drawable/ic_menu"
        app:menu="@menu/main_menu"/>

,然后在代码中设置OnCLick侦听器,只需添加以下内容即可:

toolbar.setOnMenuItemClickListener {
            // .. DO SOMETHING HERE
            false
        }

答案 10 :(得分:0)

这是一种方法:

在您的菜单中添加一个“组”:

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

    <group
        android:id="@+id/main_menu_group">
         <item android:id="@+id/done_item"
              android:title="..."
              android:icon="..."
              android:showAsAction="..."/>
    </group>
</menu>

然后,添加一个

Menu menu;

为您的活动设置变量并将其设置在您对 onCreateOptionsMenu 的覆盖中:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    this.menu = menu;
    // inflate your menu here
}

之后,当您想显示/隐藏菜单时,将此功能添加到您的活动中并使用:

public void showOverflowMenu(boolean showMenu){
    if(menu == null)
        return;
    menu.setGroupVisible(R.id.main_menu_group, showMenu);
}

这里没有人提到这种方法,所以就在这里。当每个片段没有很多项目并且具有相同的父活动时,这是一种更好的方法。 它取自this answer