【问题标题】:"Back button" using getSupportActionbar and appcompat v7 toolbar使用 getSupportActionbar 和 appcompat v7 工具栏的“后退按钮”
【发布时间】:2015-01-29 14:27:06
【问题描述】:

我正在使用 Appcompat V7 库中的新工具栏,并且正在制作一个带有导航抽屉和片段的应用程序。

在某些片段中,我不想显示汉堡包图标,而是显示箭头...很好,我是这样做的:

mDrawerToggle.setDrawerIndicatorEnabled(false);

mDrawerToggle.syncState();
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);

getSupportActionBar().setHomeAsUpIndicator(R.drawable.abc_ic_ab_back_mtrl_am_alpha);

我的问题是:我需要如何或在哪里设置主页按钮监听器,或者我需要听什么“返回”按钮? 我想调用 main backpressed 方法并用汉堡图标设置导航抽屉图标..

【问题讨论】:

    标签: android android-appcompat android-toolbar


    【解决方案1】:

    onCreate()中添加这个方法:

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    

    然后覆盖onOptionItemSelected(),如下所示:

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                onBackPressed();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
    

    【讨论】:

      【解决方案2】:

      你可以这样做:

      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);  
          toolbar = (Toolbar)findViewById(R.id.toolbar);
          if (toolbar != null) {
            setSupportActionBar(toolbar);
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
          }
      
          setUpNavigationDrawer();
      
          getFragmentManager().addOnBackStackChangedListener(backStackListener); // listen to the backstack of the fragment manager
      }
      

      定义 onBackSTackChangedListener:

      private FragmentManager.OnBackStackChangedListener backStackListener = new FragmentManager.OnBackStackChangedListener() {
         @Override
         public void onBackStackChanged() {
             setNavIcon();
         };
      }
      

      根据你的fragment的backstack设置图标:

      protected void setNavIcon() {
          int backStackEntryCount = getFragmentManager().getBackStackEntryCount();
          drawerToggle.setDrawerIndicatorEnabled(backStackEntryCount == 0);
      }
      

      检测何时按下抽屉图标:

      public boolean onOptionsItemSelected(MenuItem item) {
          if (drawerToggle.isDrawerIndicatorEnabled() && drawerToggle.onOptionsItemSelected(item)) {
              return true;
          }
      
          switch (item.getItemId()) {
            case x:
               return true;
            default:
               return false;
          }
      }
      

      并处理向上按钮:

      public boolean onSupportNavigateUp() {
          onBackPressed();
          return true;
      }
      

      这对我有用。祝你好运。

      【讨论】:

      • case x 应该是什么?
      • @taneebee : 如何接收返回箭头点击?
      【解决方案3】:

      不确定这是否适用于 OP,但在许多情况下,这可能是使用 AppCompat 工具栏实现后退按钮的最简单选项。

      跳过所有setHomeButtonEnabledsetDisplayHomeAsUpEnabledonOptionsItemSelected 以及related issues

      相反,在初始化工具栏时,只需为其设置 1) 导航图标和 2) 导航 OnClickListener:

      Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
      setSupportActionBar(toolbar);
      
      if (enableBackNavigation) {
          toolbar.setNavigationIcon(R.drawable.ic_back);
          toolbar.setNavigationOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  onBackPressed();
              }
          });
      }
      

      【讨论】:

      • 这不会停止从边缘滑动以拉出导航抽屉
      【解决方案4】:

      1- 创建Toolbar 布局;

      <?xml version="1.0" encoding="utf-8"?>
      <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:local="http://schemas.android.com/apk/res-auto"
          android:id="@+id/toolbar"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:background="@color/dark_blue"
          android:minHeight="?attr/actionBarSize"
          local:popupTheme="@style/ThemeOverlay.AppCompat.Light"
          local:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
      

      2- 将其包含在您希望 toolbar 所在位置的布局中。

      3- 将以下代码粘贴到您的活动中。(扩展 ActionBarActivity

      private Toolbar mToolbar;
      
      //For Toolbar (Action bar) start
              mToolbar = (Toolbar) findViewById(R.id.toolbar);
              setSupportActionBar(mToolbar);
              getSupportActionBar().setDisplayHomeAsUpEnabled(true);
              getSupportActionBar().setDisplayShowHomeEnabled(true);
              mToolbar.setNavigationIcon(R.drawable.ic_back_arrow);
              mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      onBackPressed();
                  }
              });
              getSupportActionBar().setTitle("Event Details");
              //For Toolbar (Action bar) end
      

      4- 将后退点击图标更改为您想要的任何内容。

      【讨论】:

      • 这是一个非常清晰、易于理解、高效且可重用的解决方案。我会以同样的方式做到这一点!做得好! ;)
      【解决方案5】:

      激活后退按钮:

      getActionBar().setDisplayHomeAsUpEnabled(enable);
      

      并监听onBackPressed()中的点击

      显然你的活动必须扩展ActionBarActivity

      【讨论】:

        【解决方案6】:

        您只需设置导航图标并确保在设置setSupportActionBar(toolbar)后设置setNavigationOnClickListener()

        toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_arrow_back));
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onBackPressed();
            }
        });
        

        【讨论】:

          【解决方案7】:

          在清单中将这些行添加到您希望后退箭头工作的活动下

          android:parentActivityName="你的父活动名称"

          【讨论】:

            【解决方案8】:

            添加 setDisplayHomeAsUpEnabled(true)

                Toolbar toolbar  = findViewById(R.id.toolbar);
                ActionBar actionBar = getSupportActionBar();
                if (actionBar != null) {
                    actionBar.setDisplayHomeAsUpEnabled(true);
                }
            

            处理返回按钮

               public boolean onSupportNavigateUp() {
                onBackPressed();
                return true;
            }
            

            【讨论】: