【问题标题】:How to set menu to Toolbar in Android如何在Android中将菜单设置为工具栏
【发布时间】:2016-06-09 12:04:24
【问题描述】:

我想使用ToolBar 而不是ActionBar,但不要在工具栏中显示菜单!!!我想要设置菜单,例如 ActionBar 中的 RefreshSetting 按钮。

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

ma​​in_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>

如何解决这个问题并在Toolbar 中显示菜单?谢谢所有亲爱的

【问题讨论】:

标签: java android xml android-toolbar android-menu


【解决方案1】:

只需在 MainPage.java 中像这样覆盖 onCreateOptionsMenu

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main_menu, menu);
    return true;
}

【讨论】:

    【解决方案2】:

    不要使用setSupportActionBar(toolbar)

    我不知道为什么,但这对我有用。

    toolbar = (Toolbar) findViewById(R.id.main_toolbar);
    toolbar.setSubtitle("Test Subtitle");
    toolbar.inflateMenu(R.menu.main_menu);
    

    对于菜单项,请执行以下操作:

    toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem item) {
            if (item.getItemId() == R.id.item1) {
                // do something
            } else if (item.getItemId() == R.id.filter) {
                // do something
            } else {
                // do something
            }
    
            return false;
        }
    });
    

    当我找到适当的解释时,将更新此答案的 why 部分。

    【讨论】:

    • 你的回答让我感到震惊,但它并没有解释为什么我不应该使用它。
    • 你应该解释为什么不使用 setSupportActionBar(toolbar) 而不是只说什么对你有用。
    • 这是唯一对我有用的东西。我正在使用带有自定义工具栏的 Xamarin.Android。
    • 我将阅读更多相关信息并更新答案@AbhinavSaxena。好电话
    • 对我来说,这样做的好处是我不再需要在我的单个活动(但很多很多片段)应用程序中将我的工具栏绑定到支持 ActionBar,这需要各种烦人的黑客攻击让应用看起来和表现良好。
    【解决方案3】:

    这是一个更完整的答案,作为对未来访问者的参考。我通常使用support toolbar,但无论哪种方式都一样好用。

    1。制作菜单xml

    这将在res/menu/main_menu

    • 右键单击res 文件夹并选择新建> Android 资源文件
    • 输入 main_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_add"
            android:icon="@drawable/ic_add"
            app:showAsAction="ifRoom"
            android:title="Add">
        </item>
        <item
            android:id="@+id/action_settings"
            app:showAsAction="never"
            android:title="Settings">
        </item>
    </menu>
    

    您可以右击res并选择新建图片资源来创建ic_add图标。

    2。膨胀菜单

    在您的活动中添加以下方法。

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main_menu, menu);
        return true;
    }
    

    3。处理菜单点击

    同样在你的Activity中,添加如下方法:

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle item selection
        switch (item.getItemId()) {
            case R.id.action_add:
                addSomething();
                return true;
            case R.id.action_settings:
                startSettings();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
    

    进一步阅读

    【讨论】:

    • 感谢您将所有必要的组件一起展示,而不仅仅是两行代码。
    【解决方案4】:

    您需要在 Activity 中覆盖此代码:

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu, this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main2, menu);
        return true;
    }
    

    并像这样设置您的工具栏:

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    

    【讨论】:

      【解决方案5】:

      你也需要这个,对菜单的每个选项执行一些操作。

      @Override
      public boolean onOptionsItemSelected(MenuItem item) {
          switch (item.getItemId()) {
              case R.id.menu_help:
                  Toast.makeText(this, "This is teh option help", Toast.LENGTH_LONG).show();
                  break;
              default:
                  break;
          }
          return true;
      }
      

      【讨论】:

        【解决方案6】:

        即使在使用 setSupportActionBar(toolbar) 时,您仍然可以使用 answer provided using Toolbar.inflateMenu

        我有一个场景,我必须将工具栏设置功能移动到活动之外的单独类中,该类本身不知道事件 onCreateOptionsMenu。

        因此,要实现这一点,我所要做的就是在调用 inflateMenu 之前等待绘制工具栏,方法是执行以下操作:

        toolbar.post {
            toolbar.inflateMenu(R.menu.my_menu)
        }
        

        可能被认为不是很干净,但仍然可以完成工作。

        【讨论】:

        • 谢谢伙计,使用这个可运行文件
        【解决方案7】:

        第一种方式: 在activitymain.xml中

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/maintoolbar"
            android:layout_width="match_parent"
            android:layout_height="56dp"/>
        

        在 MainActivity.java 中

        import androidx.appcompat.widget.Toolbar;
        private Toolbar toolbar;
        

        onCreate 方法内部-

         toolbar=findViewById(R.id.maintoolbar);
                setSupportActionBar(toolbar);
        

        在您的 MainActivity 类中-

           @Override
            public boolean onCreateOptionsMenu(Menu menu) {
                getMenuInflater().inflate(R.menu.<your menu xml file name here>,menu);
                return super.onCreateOptionsMenu(menu);
            }
        

        第二种方式

         //Remove setSupportActionBar(toolbar) and onCreateOptionmenu.
         toolbar=findViewById(R.id.maintoolbar);
         toolbar.inflateMenu(R.menu.<your menu xml file name here>);
        

        【讨论】:

          【解决方案8】:

          虽然我同意这个答案,因为它的代码行数更少并且可以工作:

          How to set menu to Toolbar in Android

          我的建议是始终使用 Android Studio 向导启动任何项目。在该代码中,您会发现一些样式:-

          &lt;style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" /&gt;

          &lt;style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" /&gt;

          和用法是:

          <android.support.design.widget.AppBarLayout
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:theme="@style/AppTheme.AppBarOverlay">
          
          <android.support.v7.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" />
          
          </android.support.design.widget.AppBarLayout> 
          

          由于styles.xml中声明了no action bar theme,即应用于AndroidManifest.xml中的Main Activity,所以没有异常,所以你必须在那里检查。

          <activity android:name=".MainActivity" android:screenOrientation="portrait"
                  android:theme="@style/AppTheme.NoActionBar">
                  <intent-filter>
                      <action android:name="android.intent.action.MAIN" />
          
                      <category android:name="android.intent.category.LAUNCHER" />
                  </intent-filter>
              </activity>
          
          1. Toolbar 不是一个独立的实体,它始终是一个子实体 在AppBarLayout 中查看,这又是 CoordinatorLayout
          2. 创建菜单的代码是从第一天开始的标准代码, 在所有答案中一次又一次地重复,特别是 标记的,但没有人意识到有什么区别。

          两者:

          Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar);

          与:

          How to set menu to Toolbar in Android

          会起作用的。

          快乐编码:-)

          【讨论】:

            【解决方案9】:

            没有 ActionBar 但有 Toolbar

            如果你想使用工具栏而不是操作栏,setSupportActionBar 原则上是矛盾的,因为@RohitSingh 回答了above

            您既不需要使用setSupportActionBar,也不需要覆盖用于ActionBar 的onCreateOptionsMenuonOptionsItemSelected

            1. NoActionBar主题
            2. 在布局 xml 中放置一个工具栏
            3. 准备菜单 xml
            4. Toolbar#inflateMenu(或者你也可以在布局xml中设置菜单)
            5. Toolbar#setOnMenuItemClickListener

            下面是一个例子。

            1. NoActionBar 主题

            (本示例使用MaterialCompolent.DayNight主题)

            <style name="Theme.AppTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
            

            2。在布局中放置一个工具栏

            (本示例使用MaterialToobar

            <androidx.constraintlayout.widget.ConstraintLayout
                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="match_parent">
            
                <com.google.android.material.appbar.MaterialToolbar
                    android:id="@+id/toolbar"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toTopOf="parent" />
            

            3.准备菜单xml

            <menu xmlns:app="http://schemas.android.com/apk/res-auto"
                xmlns:android="http://schemas.android.com/apk/res/android">
                <item
                    android:id="@+id/item1"
                    android:title="@string/item1"
                    app:showAsAction="ifRoom" />
                <item
                    android:id="@+id/item2"
                    android:title="@string/item2"
                    app:showAsAction="ifRoom" />
            </menu>
            

            4.工具栏#inflateMenu

            binding.toolbar.inflateMenu(R.menu.main); // binding is a ViewBinding
            

            5.工具栏#setOnMenuItemClickListener

            最近的 Android 建议避免使用 switch 来区分 id。使用普通的if ~ else if ~ else 块是可取的。除此之外,我们还可以在 Java 8 中使用 lambda

            binding.toolbar.setOnMenuItemClickListener(menuItem -> {
                int itemId = menuItem.getItemId();
                if (itemId == R.id.item1) {
                    // do something for item1
                    return true;
                } else if (itemId == R.id.item2) {
                    // do something for item2
                    return true;
                } else {
                    // if you do nothing, returning false should be appropriate.
                    return false;
                }
            });
            

            【讨论】:

              【解决方案10】:

              在您的活动中覆盖此方法。

                 @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>
              

              【讨论】:

                【解决方案11】:

                在 XML 中在 &lt;Toolbar/&gt; 内添加一行

                <com.google.android.material.appbar.MaterialToolbar
                app:menu="@menu/main_menu"/>
                

                在java文件中,替换为:

                 setSupportActionBar(toolbar);
                        if (getSupportActionBar() != null) {
                            getSupportActionBar().setTitle("Main Page");
                        }
                

                用这个:

                toolbar.setTitle("Main Page")
                

                【讨论】:

                  【解决方案12】:

                  在我的例子中,我使用的是带有 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>
                  

                  ma​​in_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>
                  

                  【讨论】:

                    【解决方案13】:

                    你可以通过两种方法来实现这一点

                    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/

                    【讨论】:

                      【解决方案14】:

                      对此的简单修复是在 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>
                      

                      【讨论】:

                        【解决方案15】:
                        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>
                        

                        工具栏.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>
                        

                        【讨论】:

                          【解决方案16】:
                          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);

                          【讨论】:

                            猜你喜欢
                            • 2019-05-31
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            相关资源
                            最近更新 更多