Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android-将ActionBar返回按钮切换到导航按钮_Android_Android Actionbar_Navigation Drawer_Android Toolbar_Back Button - Fatal编程技术网

Android-将ActionBar返回按钮切换到导航按钮

Android-将ActionBar返回按钮切换到导航按钮,android,android-actionbar,navigation-drawer,android-toolbar,back-button,Android,Android Actionbar,Navigation Drawer,Android Toolbar,Back Button,我有以下问题: 我知道如何设置工具栏以显示后退按钮图标而不是汉堡按钮图标。 由此: 为此: 使用:getSupportActionBar().setDisplayHomeAsUpEnabled(true) 现在,我想做相反的动作,我想从后退按钮图标转到汉堡图标: 到这里: 我该怎么做 更新: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceSt

我有以下问题:

我知道如何设置工具栏以显示后退按钮图标而不是汉堡按钮图标。

由此:

为此:

使用:
getSupportActionBar().setDisplayHomeAsUpEnabled(true)


现在,我想做相反的动作,我想从后退按钮图标转到汉堡图标:

到这里:

我该怎么做

更新:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setSupportActionBar(mToolbar);
    getSupportActionBar().setDisplayShowTitleEnabled(false);
}

private void enableViews(boolean enable) {
    if(enable) {
        // Enables back button icon
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    } else {
        // TODO: Enables burger icon
    }
}

您可以使用以下命令更改操作栏按钮:

        getSupportActionBar().setHomeAsUpIndicator(R.drawable.back_button);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
用这个

getSupportActionBar().setDisplayShowHomeEnabled(true);
final Toolbar=(Toolbar)findviewbyd(R.id.actionbar);
setTitle(Html.fromHtml(“+getString(R.string.print_)+”);
toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.menu_图标));
toolbar.setNavigationOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
DetailActivity.this.finish();
}
});
工具栏.inflateMenu(R.menu.fav);
toolbar.setOnMenuItemClickListener(新建toolbar.OnMenuItemClickListener()){
@凌驾
公共布尔onMenuItemClick(菜单项){
item.setIcon(右侧可绘制的背面图标)
返回true;
}
返回false;
}
});

尝试在
活动的主题/样式中添加以下
样式的代码
AppTheme
。xml
它将使您的
汉堡图标
变为带有
动画的
后退图标

条件如果您将汉堡图标与
NavigationDrawer
AppCompatActivity/ActionBarActivity

<style name="AppTheme" parent="Theme.AppCompat.Light">
            <item name="windowActionBar">false</item>
            <item name="drawerArrowStyle">@style/DrawerArrowStyle</item>
        </style>


<style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle">
    <item name="spinBars">true</item>
    <item name="color">@android:color/white</item>
</style>

假的
@样式/抽屉箭头样式
真的
@android:彩色/白色
我希望有帮助!或者你只需要用drawable就可以了


检查此项

如果我假设您在布局中使用的是
android.support.v4.widget.DrawerLayout
,则此方法可能适合您;我只在
API21
上进行了测试,但考虑到它主要使用支持库,它应该在较低或较高的目标上工作(著名的最后一句话)

import android.support.v7.app.ActionBarDrawerToggle
import android.support.v4.widget.DrawerLayout

    ActionBarDrawerToggle mDrawerToggle;
    DrawerLayout drawerLayout;
    private boolean mToolBarNavigationListenerIsRegistered = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setSupportActionBar(mToolbar);
        getSupportActionBar().setDisplayShowTitleEnabled(false);
        // Get DrawerLayout ref from layout
        drawerLayout = (DrawerLayout)findViewById(R.id.drawer);
        // Initialize ActionBarDrawerToggle, which will control toggle of hamburger.
        // You set the values of R.string.open and R.string.close accordingly.
        // Also, you can implement drawer toggle listener if you want.
        mDrawerToggle = new ActionBarDrawerToggle (this, drawerLayout, mToolbar, R.string.open, R.string.close);
        // Setting the actionbarToggle to drawer layout
        drawerLayout.addDrawerListener(mDrawerToggle);
        // Calling sync state is necessary to show your hamburger icon...
        // or so I hear. Doesn't hurt including it even if you find it works
        // without it on your test device(s)
        mDrawerToggle.syncState();
    }

    /**
     * To be semantically or contextually correct, maybe change the name
     * and signature of this function to something like:
     *
     * private void showBackButton(boolean show)
     * Just a suggestion.
     */
     private void enableViews(boolean enable) {

        // To keep states of ActionBar and ActionBarDrawerToggle synchronized,
        // when you enable on one, you disable on the other.
        // And as you may notice, the order for this operation is disable first, then enable - VERY VERY IMPORTANT.
        if(enable) {
            //You may not want to open the drawer on swipe from the left in this case  
            drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
            // Remove hamburger
            mDrawerToggle.setDrawerIndicatorEnabled(false);
            // Show back button
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            // when DrawerToggle is disabled i.e. setDrawerIndicatorEnabled(false), navigation icon
            // clicks are disabled i.e. the UP button will not work.
            // We need to add a listener, as in below, so DrawerToggle will forward
            // click events to this listener.
            if(!mToolBarNavigationListenerIsRegistered) {
                mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        // Doesn't have to be onBackPressed
                        onBackPressed();
                    }
                });

                mToolBarNavigationListenerIsRegistered = true;
            }

        } else {
            //You must regain the power of swipe for the drawer. 
            drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);

            // Remove back button
            getSupportActionBar().setDisplayHomeAsUpEnabled(false);
            // Show hamburger 
            mDrawerToggle.setDrawerIndicatorEnabled(true);
            // Remove the/any drawer toggle listener
            mDrawerToggle.setToolbarNavigationClickListener(null);
            mToolBarNavigationListenerIsRegistered = false;
        }

        // So, one may think "Hmm why not simplify to:
        // .....
        // getSupportActionBar().setDisplayHomeAsUpEnabled(enable);
        // mDrawer.setDrawerIndicatorEnabled(!enable);
        // ......
        // To re-iterate, the order in which you enable and disable views IS important #dontSimplify.
    }

该解决方案使用
ActionBarDrawerToggle.setDrawerIndicatorEnabled
切换汉堡图标的可见性,并使用
ActionBar.setDisplayHomeAsUpEnabled
切换向上按钮的可见性,基本上利用了它们各自的
可绘制资源

其他假设

  • 您的活动主题扩展了
    theme.AppCompat.Light.NoActionBar

我在中找到了灵活的解决方案

所以用法非常简单

setToolbarAsUp(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // onBackPressed();
        // or navigate to parent or some other intent
    }
});

对我来说,当我使用
导航抽屉时,我想通过
片段
操作栏左侧的后箭头图标更改汉堡图标。还在右侧添加菜单

Main活动中,它已经设置好了-默认情况下,当Android Studio为我创建导航抽屉时-如下所示:

Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
DrawerLayout drawer = findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open,
                R.string.navigation_drawer_close);
drawer.addDrawerListener(toggle);
toggle.syncState();
问题是如何自定义
片段中的
操作栏
,因此当我转到
片段
时,它将显示自定义的
操作栏
,当单击后退箭头图标时,它将离开片段,而
操作栏
应返回到第一个状态

片段中(完整实现):

fragment\u actionbar.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:layout_gravity="fill_horizontal" >

    <ImageView
        android:id="@+id/back"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:src="@drawable/ic_menu_back"
        android:layout_marginLeft="@dimen/_5sdp"
        android:layout_alignParentStart="true"
        android:layout_marginStart="@dimen/_5sdp" />

</RelativeLayout>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportHeight="459"
    android:viewportWidth="459">
    <path
        android:fillColor="#ffffff"
        android:pathData="M178.5,140.25v-102L0,216.75l178.5,178.5V290.7c127.5,0,216.75,40.8,280.5,130.05C433.5,293.25,357,165.75,178.5,140.25z"/>
</vector>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:background="@drawable/border_shadow">

    <item
        android:id="@+id/option1"
        android:title="@string/show_profile"
        app:showAsAction="never"/>
    <item
        android:id="@+id/option2"
        android:title="@string/report_pic"
        app:showAsAction="never"/>
    <item
        android:id="@+id/option3"
        android:title="@string/delete_pic"
        app:showAsAction="never"/>
</menu>

ic\u menu\u back.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:layout_gravity="fill_horizontal" >

    <ImageView
        android:id="@+id/back"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:src="@drawable/ic_menu_back"
        android:layout_marginLeft="@dimen/_5sdp"
        android:layout_alignParentStart="true"
        android:layout_marginStart="@dimen/_5sdp" />

</RelativeLayout>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportHeight="459"
    android:viewportWidth="459">
    <path
        android:fillColor="#ffffff"
        android:pathData="M178.5,140.25v-102L0,216.75l178.5,178.5V290.7c127.5,0,216.75,40.8,280.5,130.05C433.5,293.25,357,165.75,178.5,140.25z"/>
</vector>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:background="@drawable/border_shadow">

    <item
        android:id="@+id/option1"
        android:title="@string/show_profile"
        app:showAsAction="never"/>
    <item
        android:id="@+id/option2"
        android:title="@string/report_pic"
        app:showAsAction="never"/>
    <item
        android:id="@+id/option3"
        android:title="@string/delete_pic"
        app:showAsAction="never"/>
</menu>

fragment\u menu.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:layout_gravity="fill_horizontal" >

    <ImageView
        android:id="@+id/back"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:src="@drawable/ic_menu_back"
        android:layout_marginLeft="@dimen/_5sdp"
        android:layout_alignParentStart="true"
        android:layout_marginStart="@dimen/_5sdp" />

</RelativeLayout>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportHeight="459"
    android:viewportWidth="459">
    <path
        android:fillColor="#ffffff"
        android:pathData="M178.5,140.25v-102L0,216.75l178.5,178.5V290.7c127.5,0,216.75,40.8,280.5,130.05C433.5,293.25,357,165.75,178.5,140.25z"/>
</vector>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:background="@drawable/border_shadow">

    <item
        android:id="@+id/option1"
        android:title="@string/show_profile"
        app:showAsAction="never"/>
    <item
        android:id="@+id/option2"
        android:title="@string/report_pic"
        app:showAsAction="never"/>
    <item
        android:id="@+id/option3"
        android:title="@string/delete_pic"
        app:showAsAction="never"/>
</menu>


我一直在我的应用程序上尝试这些示例,但它们似乎都不起作用。我使用的是片段,其中一些片段必须显示back选项,而不是home。以下是我的实现(在Kotlin中):

注意:这些是片段中重写的onResume和onStop方法

备注:汉堡图标仅在调用toggle.syncState()方法时才会显示。我已经花了将近24个小时弄明白为什么家里的图标没有显示出来


希望我的帖子能帮助到别人。

->如果你在homeactivity和initalfragment上有一个抽屉,你必须显示抽屉切换,在内部框架后,你不想显示抽屉代表抽屉,你必须显示后退按钮,并像这样更改所有框架的标题

  • 在活动中公开你的行动

  • 在您的主页片段中编写此代码

    @Override
    
    public void onResume() 
    
    {
        super.onResume();
    
        ((HomeActivity)getActivity()).getSupportActionBar().setTitle("Home");
    
        ((HomeActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(false);
    
        ((HomeActivity)getActivity()).actionBarDrawerToggle.setDrawerIndicatorEnabled(true);}    
    
  • 在其他片段中编写以下代码:

         @Override
        public void onResume() 
    {     super.onResume();
            ((HomeActivity)getActivity()).getSupportActionBar().setTitle("My Account");
            ((HomeActivity)getActivity()).actionBarDrawerToggle.setDrawerIndicatorEnabled(false);
            ((HomeActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        }
    
  • 在您的主要活动中,请在backpressed上写下:

    @Override
        public void onBackPressed() 
        {
            if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
    
                getSupportFragmentManager().popBackStackImmediate();
    
            } else {
    
                super.onBackPressed();
    
            }
        }
    

    • 在我看来,选择的答案太粗糙了

      我试着实现它,在这样做的同时,我意识到
      ActionBarDrawerToggle
      实际上没有什么用处(也许这就是为什么它被从官方android教程中删除):当你想在导航抽屉和动作栏之间协调时,它不会让你的生活更轻松

      问题是,你只有一个主页“按钮”,它有两种不同的功能-当你在主屏幕上时打开抽屉,当你在应用程序的较低位置时,向上移动。将工具栏作为参数传递给
      ActionBarDrawerToggle
      constructor,向其添加菜单图标,并在单击事件时调用openDrawer。现在,如果你想切换到一个向上事件,你必须关闭这个特殊的图标,并重新启用动作栏固有的后退功能。。。还是一团糟

      因此,如果
      ActionBarDrawerToggle
      对你没有帮助(也许有人会想出一种方法来解决问题),为什么要首先使用它呢?以下是如何在没有它的情况下做到这一点:

      boolean homeShouldOpenDrawer; // flag for onOptionsItemSelected
      
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          ...
          // if you're using NoActionBar theme
          Toolbar toolbar = findViewById(R.id.toolbar);
          setSupportActionBar(toolbar);
      
          ActionBar actionbar = getSupportActionBar();
      
          // enables the home button with a <-
          actionbar.setDisplayHomeAsUpEnabled(true);
      
          // replaces the <- with the menu (hamburger) icon 
          // (ic_menu should be in every empty project, and can be easily added)
          actionbar.setHomeAsUpIndicator(R.drawable.ic_menu);
      
          // I assume your first fragment/state should be main screen, i.e. home = opens drawer
          homeShouldOpenDrawer = true;
          ...
      }
      
      private void enableViews(boolean enable) {
          if(enable) {
              // Enables back button icon
              // passing null or 0 brings back the <- icon
              getSupportActionBar().setHomeAsUpIndicator(null);
              homeShouldOpenDrawer = false;
          } else {
              // Enables burger icon
              getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_menu);
              homeShouldOpenDrawer = true;
          }
      
      }
      
      // this is called whenever a selection is made from the action bar
      @Override
      public boolean onOptionsItemSelected(MenuItem item) {
          switch (item.getItemId()) {
              case android.R.id.home:
                  if (homeShouldOpenDrawer) {
                      drawerLayout.openDrawer(GravityCompat.START);
                  } else {
                      onBackPressed();
                  }
          }
      
          return super.onOptionsItemSelected(item);
      }
      
      boolean homeShouldOpenDrawer;//OnOptions ItemSelected的标志
      @凌驾
      创建时受保护的void(Bundle savedInstanceState){
      ...
      
      (activity as MainActivity).supportActionBar?.setHomeAsUpIndicator(R.drawable.ic_arrow_back)
      
      if (supportFragmentManager.backStackEntryCount > 0) {
        supportActionBar!!.setDisplayHomeAsUpEnabled(true)
        toolbar.setNavigationOnClickListener {
            if (supportFragmentManager.backStackEntryCount > 0) {
                super.onBackPressed()
            } else {
                supportActionBar!!.setDisplayHomeAsUpEnabled(false)
                drawerLayout.addDrawerListener(toggle)
                toggle.syncState()
                drawerLayout.openDrawer(GravityCompat.START)
            }
        }
      } else {
        supportActionBar!!.setDisplayHomeAsUpEnabled(false)
        drawerLayout.addDrawerListener(toggle)
        toggle.syncState()
      }