【问题标题】:Creating a button in Android Toolbar在 Android 工具栏中创建一个按钮
【发布时间】:2015-09-22 18:13:34
【问题描述】:

如何在 Android 的 Toolbar 中创建一个类似于 iOS 示例的按钮?

【问题讨论】:

    标签: android android-toolbar


    【解决方案1】:

    带按钮的工具栏教程

    1 - 在 build.gradle 中添加库兼容性

    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        compile 'com.android.support:appcompat-v7:21.0.3'
    }
    

    2 - 创建文件名color.xml 以定义Toolbar 颜色

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <color name="ColorPrimary">#FF5722</color>
        <color name="ColorPrimaryDark">#E64A19</color>
    </resources>
    

    3 - 修改您的 style.xml 文件

    <resources>     
        <!-- Base application theme. -->
        <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    
            <item name="colorPrimary">@color/ColorPrimary</item>
            <item name="colorPrimaryDark">@color/ColorPrimaryDark</item>
            <!-- Customize your theme here. -->
        </style>     
    </resources>
    

    4 - 创建一个像tool_bar.xml这样的xml文件

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.v7.widget.Toolbar
     xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/colorPrimary"
        android:elevation="4dp" />
    

    5 - 将Toolbar 包含在您的main_activity.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <include
            android:id="@+id/tool_bar"
            layout="@layout/tool_bar" />
    
        <TextView
            android:layout_below="@+id/tool_bar"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="@dimen/TextDimTop"
            android:text="@string/hello_world" />
    
    </RelativeLayout>
    

    6 - 然后,把它放在你的 MainActivity 类中

    package com.example.hp1.materialtoolbar;
    
    import android.support.v4.widget.DrawerLayout;
    import android.support.v7.app.ActionBarActivity;
    import android.os.Bundle;
    import android.support.v7.app.ActionBarDrawerToggle;
    import android.support.v7.widget.LinearLayoutManager;
    import android.support.v7.widget.RecyclerView;
    import android.support.v7.widget.Toolbar;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.MotionEvent;
    import android.view.View;
    import android.widget.Toast;
    
    /* When using AppCompat support library                                                             
     * (you need to extend Main Activity to                                                            
     * ActionBarActivity)
     * ActionBarActivity has deprecated, use AppCompatActivity
     */
    public class MainActivity extends ActionBarActivity { 
        // Declaring the Toolbar Object
        private Toolbar toolbar;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main_activity);
    
            // Attaching the layout to the toolbar object
            toolbar = (Toolbar) findViewById(R.id.tool_bar);
            // Setting toolbar as the ActionBar with setSupportActionBar() call
            setSupportActionBar(toolbar);
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.menu_main, menu);
            return true;
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            // Handle action bar item clicks here. The action bar will
            // automatically handle clicks on the Home/Up button, so long
            // as you specify a parent activity in AndroidManifest.xml.
            int id = item.getItemId();
    
            //noinspection SimplifiableIfStatement
            if (id == R.id.action_settings) {
                return true;
            }
    
            return super.onOptionsItemSelected(item);
        }
    }
    

    7 - 最后,将您的“按钮项”添加到 menu_main.xml 内的 /res/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"
            xmlns:tools="http://schemas.android.com/tools"
            tools:context=".MainActivity">
            <item
                android:id="@+id/action_settings"
                android:orderInCategory="100"
                android:title="@string/action_settings"
                app:showAsAction="never" />
            <item
                android:id="@+id/action_search"
                android:orderInCategory="200"
                android:title="Search"
                android:icon="@drawable/ic_search"
                app:showAsAction="ifRoom"/>                
            <item
                android:id="@+id/action_user"
                android:orderInCategory="300"
                android:title="User"
                android:icon="@drawable/ic_user"
                app:showAsAction="ifRoom" />        
        </menu>
    

    【讨论】:

    • +1 循序渐进,比 Google Docs 好得多。缺少的一件事是说必须在 /res/menu/ 目录中创建 menu_main.xml,并且在 menu_main.xml 中缺少“
    • 很好的指南,但这没有显示文本,它缺少对问题“看起来像这样”部分的答案。我同意最好遵循 Android 风格,但我认为这是问题的难点。
    • 看起来像最新的 ADK 之一已弃用 ActionBarActivity,现在希望您使用 AppCompatActivity,所以这对我不起作用。
    • @tardoandre 问题是“在 android 工具栏中创建 Button”,但您在工具栏中添加了 item... Button 和 item 之间存在差异:P
    • 技术上@AmitUpadhyay 是对的。菜单项不会膨胀为按钮,可访问性公告将是“保存,双击激活”而不是“保存,按钮,双击激活”(如果操作是“保存”)
    【解决方案2】:

    工具栏自定义可以通过以下方式完成

    在工具栏内编写按钮和textViews代码,如下所示

    <android.support.v7.widget.Toolbar
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/app_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >
    
        <Button
          android:layout_width="wrap_content"
            android:layout_height="@dimen/btn_height_small"
            android:text="Departure"
            android:layout_gravity="right"
            />
    </android.support.v7.widget.Toolbar>
    

    另一种方法是使用如下所示的项目菜单

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

    【讨论】:

    • layout_gravity 属性不可用
    • 您可以将按钮包裹在RelativeLayout 中(将宽度设置为match_parent)并应用layout_alignParentEnd="true"
    • @JeelShah 如果将宽度设置为match_parent,则会从工具栏中删除标题。
    【解决方案3】:

    另一种可能性是在菜单中设置app:actionViewClass 属性:

    <menu xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:app="http://schemas.android.com/apk/res-auto">
      <item
         android:id="@+id/get_item"
         android:orderInCategory="1"
         android:text="Get"
         app:showAsAction="always" 
         app:actionViewClass="android.support.v7.widget.AppCompatButton"/>
    </menu>
    

    在您的代码中,您可以在菜单膨胀后访问此按钮:

    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater menuInflater = getMenuInflater();
        menuInflater.inflate(R.menu.sample, menu);
    
        MenuItem getItem = menu.findItem(R.id.get_item);
        if (getItem != null) {
            AppCompatButton button = (AppCompatButton) getItem.getActionView();
            //Set a ClickListener, the text, 
            //the background color or something like that
        }
    
        return super.onCreateOptionsMenu(menu);
    }
    

    【讨论】:

    • 这是 IMO 最好的解决方案,它需要最少的摸索。
    • 有史以来最好的解决方案...使用 android.widget.Button 为 androidX
    【解决方案4】:

    我在工具栏中添加了文本:

    menu_skip.xml

    <menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        tools:context=".MainActivity">
    
        <item
            android:id="@+id/action_settings"
            android:title="@string/text_skip"
            app:showAsAction="never" />
    </menu>
    

    MainActivity.java

    @Override
    boolean onCreateOptionsMenu(Menu menu) {
        inflater = getMenuInflater();
        inflater.inflate(R.menu.menu_otp_skip, menu);
        return true;
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            // action with ID action_refresh was selected
            case R.id.menu_item_skip:
                Toast.makeText(this, "Skip selected", Toast.LENGTH_SHORT)
                        .show();
                break;
            default:
                break;
        }
        return true;
    }
    

    【讨论】:

      【解决方案5】:

      它们在工具栏/操作栏中被称为菜单项或操作按钮。在这里你有谷歌教程它是如何工作的以及如何添加它们 https://developer.android.com/training/basics/actionbar/adding-buttons.html

      【讨论】:

        【解决方案6】:

        您实际上可以在工具栏中放置任何内容。请参阅下面的代码。

        <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentStart="true"
                android:background="@color/colorPrimary">
        
        </android.support.v7.widget.Toolbar>
        

        在上面的工具栏标签之间,您几乎可以放置任何东西。这就是使用工具栏的好处。

        来源:Android Toolbar Example

        【讨论】:

          【解决方案7】:

          您可以使用支持库中的actionLayout

          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/button_item"
              android:title=""
              app:actionLayout="@layout/button_layout"
              app:showAsAction="always"
              />
          </menu>
          

          button_layout.xml

          <?xml version="1.0" encoding="utf-8"?>
          <RelativeLayout
          xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="fill_parent"
          android:layout_height="match_parent"
          android:orientation="horizontal">
          
          <Button
              android:id="@+id/button"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_centerHorizontal="true"
              android:layout_centerVertical="true"
              />
          
          </RelativeLayout>
          

          Activity.java

          @Override
          public boolean onCreateOptionsMenu(Menu menu) {
              getMenuInflater().inflate(R.menu.menu, menu);
              MenuItem item = menu.findItem(R.id.button_item);
              Button btn = item.getActionView().findViewById(R.id.button);
              btn.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View view) {
                      Toast.makeText(MainActivity.this, "Toolbar Button Clicked!", Toast.LENGTH_SHORT).show();
                  }
              });
              return true;
          }
          

          【讨论】:

          • 简洁明了
          【解决方案8】:

          我可以通过将Button 包装成ConstraintLayout 来实现:

          <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:app="http://schemas.android.com/apk/res-auto"
              xmlns:tools="http://schemas.android.com/tools"
              android:layout_width="match_parent"
              android:layout_height="match_parent">
          
              <com.google.android.material.appbar.AppBarLayout
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content"
                  app:elevation="0dp">
          
                  <androidx.appcompat.widget.Toolbar
                      android:id="@+id/top_toolbar"
                      android:layout_width="match_parent"
                      android:layout_height="?attr/actionBarSize"
                      android:background="@color/white_color">
          
                      <androidx.constraintlayout.widget.ConstraintLayout
                          android:layout_width="match_parent"
                          android:layout_marginTop="10dp"
                          android:layout_height="wrap_content">
          
                          <TextView
                              android:id="@+id/cancel"
                              android:layout_width="wrap_content"
                              android:layout_height="wrap_content"
                              android:text="@string/cancel"
                              android:layout_marginStart="5dp"
                              app:layout_constraintBottom_toBottomOf="parent"
                              app:layout_constraintLeft_toLeftOf="parent"
                              app:layout_constraintTop_toTopOf="parent" />
          
                          <Button
                              android:id="@+id/btn_publish"
                              android:layout_width="wrap_content"
                              android:layout_height="wrap_content"
                              android:text="@string/publish"
                              android:background="@drawable/button_publish_rounded"
                              app:layout_constraintTop_toTopOf="parent"
                              app:layout_constraintBottom_toBottomOf="parent"
                              app:layout_constraintEnd_toEndOf="parent"
                              android:layout_marginEnd="10dp"
                              app:layout_constraintLeft_toRightOf="@id/cancel"
                              tools:layout_editor_absoluteY="0dp" />
          
                      </androidx.constraintlayout.widget.ConstraintLayout>
          
                  </androidx.appcompat.widget.Toolbar>
          
              </com.google.android.material.appbar.AppBarLayout>
          
          </androidx.coordinatorlayout.widget.CoordinatorLayout>
          

          您可以创建一个可绘制资源button_publish_rounded,定义按钮属性并将此文件分配给按钮的android:background 属性:

          <?xml version="1.0" encoding="utf-8"?>
          <shape xmlns:android="http://schemas.android.com/apk/res/android">
              <solid android:color="@color/green" />
              <corners android:radius="100dp" />
          </shape>
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-06-11
            • 2015-07-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多