如何在Android中将菜单设置到工具栏

140

我想使用ToolBar代替ActionBar,但是不要在工具栏中显示菜单!!! 我希望在ActionBar中设置菜单,例如刷新设置按钮。

输入图像描述

Toolbar.xml 代码:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary"
    android:minHeight="?attr/actionBarSize"
    app:navigationContentDescription="@string/abc_action_bar_up_description"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    app:title="Main Page"
    android:gravity="center"/>

MainPage.java 代码:

public class MainPage extends AppCompatActivity {
    private Toolbar toolbar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_page);

        toolbar = (Toolbar) findViewById(R.id.main_toolbar);
        setSupportActionBar(toolbar);
        if (getSupportActionBar() != null) {
            getSupportActionBar().setTitle("Main Page");
        }
        toolbar.setSubtitle("Test Subtitle");
        toolbar.inflateMenu(R.menu.main_menu);
    }
}

main_menu.xml 代码:

<?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/menu_main_setting"
        android:icon="@drawable/ic_settings"
        android:orderInCategory="100"
        app:showAsAction="always"
        android:actionLayout="@layout/toolbar"
        android:title="Setting" />

    <item
        android:id="@+id/menu_main_setting2"
        android:icon="@drawable/ic_settings"
        android:orderInCategory="200"
        app:showAsAction="always"
        android:actionLayout="@layout/toolbar"
        android:title="Setting" />

</menu>
如何解决这个问题并在工具栏中显示菜单?谢谢大家!<3

4
您可以在此处查看:https://dev59.com/Nl0Z5IYBdhLWcg3wpRlW - Chol
3
并且最好从谷歌获取:http://developer.android.com/training/appbar/setting-up.html - Chol
2
这就是我所缺少的:toolbar.inflateMenu(R.menu.main_manu); - skryshtafovych
尝试使用Android Studio创建一个新的应用程序并检查它。ToolBar不应该是一个独立的实体。 - Abhinav Saxena
18个回答

2
在您的活动中覆盖此方法。
   @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main_menu, menu);
        return true;
    }

这将使你的菜单向下充气:
 <?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/menu_main_setting"
            android:icon="@drawable/ic_settings"
            android:orderInCategory="100"
            app:showAsAction="always"
            android:actionLayout="@layout/toolbar"
            android:title="Setting" />

        <item
            android:id="@+id/menu_main_setting2"
            android:icon="@drawable/ic_settings"
            android:orderInCategory="200"
            app:showAsAction="always"
            android:actionLayout="@layout/toolbar"
            android:title="Setting" />

    </menu>

2

您实际上不需要在片段/活动类中进行任何操作,即可在工具栏内获得菜单。您可以在onViewCreated方法中使用Rohit Singh的方法。

import androidx.appcompat.widget.Toolbar
...
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    val toolbar = view.findViewById<Toolbar>(R.id.inbox_toolbar)
    toolbar.inflateMenu(R.menu.inbox_menu)
}

或者,只需在工具栏内定义一个app:menu元素即可。
<androidx.appcompat.widget.Toolbar ...
app:menu= "@menu/myMenu" ?>

1
在我的情况下,我正在使用一个带有CollapsingToolbarLayout的AppBarLayout,菜单总是滚动到屏幕外面,我通过将菜单XML中的android:actionLayout切换到工具栏的id来解决了我的问题。我希望它能帮助处于同样情况的人!

activity_main.xml

<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:fab="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".activities.MainScreenActivity"
    android:screenOrientation="portrait">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="300dp"
        app:elevation="0dp"
        android:theme="@style/AppTheme.AppBarOverlay">
        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/collapsingBar"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_scrollFlags="exitUntilCollapsed|scroll"
            app:contentScrim="?attr/colorPrimary"
            app:expandedTitleMarginStart="48dp"
            app:expandedTitleMarginEnd="48dp"
            >
            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="?attr/colorPrimary"
                app:elevation="0dp"
                app:popupTheme="@style/AppTheme.PopupOverlay"
                app:layout_collapseMode="pin"/>
        </android.support.design.widget.CollapsingToolbarLayout>


    </android.support.design.widget.AppBarLayout>
</android.support.design.widget.CoordinatorLayout>

main_menu.xml

<?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/logoutMenu"
        android:orderInCategory="100"
        android:title="@string/log_out"
        app:showAsAction="never"
        android:actionLayout="@id/toolbar"/>
    <item
        android:id="@+id/sortMenu"
        android:orderInCategory="100"
        android:title="@string/sort"
        app:showAsAction="never"/> </menu>

1

您可以通过两种方法实现此目标

  1. 使用XML
  2. 使用Java

使用XML 将此属性添加到工具栏的XML中 app:menu = "menu_name"

使用Java 通过覆盖onCreateOptionMenu(Menu menu)函数

public class MainActivity extends AppCompatActivity { 

  private Toolbar toolbar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
}
@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.demo_menu,menu);
        return super.onCreateOptionsMenu(menu);
    }
}

要了解更多详情或实现,请点击菜单并阅读本文章:https://bedevelopers.tech/android-toolbar-implementation-using-android-studio/


0
private Toolbar toolbar;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    toolbar = (Toolbar) findViewById(R.id.my_toolbar);
    *// here is where you set it to show on the toolbar*
    setSupportActionBar(toolbar);
}

好的,你需要设置支持操作栏 setSupportActionBar(); 并传递你的变量,像这样:setSupportActionBar(toolbar);


0

解决这个问题的简单方法是在res/menu中的menu.xml中将showAsAction设置为always

<?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/add_alarm"
        android:icon="@drawable/ic_action_name"
        android:orderInCategory="100"
        android:title="Add"
        app:showAsAction="always"
        android:visible="true"/>

</menu>

0
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar;        
    toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayShowTitleEnabled(false);
  }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu_drawer,menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_drawer){
           drawerLayout.openDrawer(GravityCompat.END);
            if (drawerLayout.isDrawerOpen(GravityCompat.END)) {
                drawerLayout.closeDrawer(GravityCompat.END);
            } else {
                drawerLayout.openDrawer(GravityCompat.END);
            }
        }
        return super.onOptionsItemSelected(item);
    }

res/layout/drawer_menu

<?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/action_drawer"
        android:title="@string/app_name"
        android:icon="@drawable/ic_menu_black_24dp"
        app:showAsAction="always"/>

</menu>

toolbar.xml

<com.google.android.material.appbar.AppBarLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">

<androidx.appcompat.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="?attr/colorPrimary"
    app:popupTheme="@style/AppTheme.PopupOverlay"
    app:titleTextColor="@android:color/white"
    app:titleTextAppearance="@style/TextAppearance.Widget.Event.Toolbar.Title">

     <TextView
         android:id="@+id/toolbar_title"
         android:layout_gravity="center"
         android:layout_height="wrap_content"
         android:layout_width="wrap_content"
         android:text="@string/app_name"
         android:textColor="@android:color/white"
         style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title" />

</androidx.appcompat.widget.Toolbar>


0
创建选项菜单在Activity和Fragment中是不同的。一个Activity是你的应用程序的一个屏幕,而一个Fragment是应用程序用户界面的一部分,它与一个Activity绑定在一起。这使得Fragment更轻量级且运行速度更快。
始终记住这一点。现在转向代码,在工具栏中创建菜单,首先要填充工具栏,然后再填充菜单本身。此外,请确保在Fragment的onCreate方法中存在setHasOptionsMenu(true)
 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

上面是onCreate()方法
  public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)
{
    // Inflate the layout for this fragment
    View v= inflater.inflate(R.layout.fragment_home, container, false);
    materialToolbar=v.findViewById(R.id.materialHomeToolbar);
    materialToolbar.inflateMenu(R.menu.topapp_menu);

    materialToolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener()
    {
        @Override
        public boolean onMenuItemClick(MenuItem item)
        {
            int t=0;
            if(item.getItemId()==R.id.notification)
                Toast.makeText(getContext(), item.getTitle(), Toast.LENGTH_SHORT).show();
            else if(item.getItemId()==R.id.myAccount)
                Toast.makeText(getContext(), item.getTitle(), Toast.LENGTH_SHORT).show();
            else if(item.getItemId()==R.id.terms)
                Toast.makeText(getContext(), item.getTitle(), Toast.LENGTH_SHORT).show();
            else if(item.getItemId()==R.id.contactUs)
                Toast.makeText(getContext(), item.getTitle(), Toast.LENGTH_SHORT).show();
            else if(item.getItemId()==R.id.help)
                Toast.makeText(getContext(), item.getTitle(), Toast.LENGTH_SHORT).show();
            else if(item.getItemId()==R.id.feedback)
                Toast.makeText(getContext(), item.getTitle(), Toast.LENGTH_SHORT).show();
            return true;
        }
    });
    return v;
}

}

上面是onCreateView()方法,我在其中使用setOnMenuItemClickListener()来在点击项目时打印一个toast消息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接