在工具栏上显示返回箭头

599

我正在将我的应用程序从ActionBar迁移到Toolbar,但是我不知道如何在Toolbar上显示并设置返回箭头的单击事件,就像我在Actionbar上做的那样。

enter image description here

使用Actionbar,我调用mActionbar.setDisplayHomeAsUpEnabled(true),但没有类似的方法。

有人曾经遇到这种情况并找到了解决办法吗?


这个 https://dev59.com/oF0a5IYBdhLWcg3w6sVk#29809691 怎么样? - mDroidd
在这里使用 getSupportActionBar() 的示例:http://www.freakyjolly.com/how-to-add-back-arrow-in-android-activity/ - Code Spy
27个回答

1045

如果您正在使用ActionBarActivity,那么您可以告诉Android将Toolbar用作ActionBar,方法如下:

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

接着调用

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);

这将起作用。您还可以在附加到 ActionBarActivities 的片段中使用它,像这样:

((ActionBarActivity) getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);
((ActionBarActivity) getActivity()).getSupportActionBar().setDisplayShowHomeEnabled(true);

如果您没有使用ActionBarActivities,或者您想在未设置为您的SupportActionBarToolbar上获取返回箭头,则可以使用以下内容:

mActionBar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_action_back));
mActionBar.setNavigationOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
       //What to do on back clicked
   }
});

如果你正在使用 android.support.v7.widget.Toolbar,那么你应该将以下代码添加到你的 AppCompatActivity 中:
@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}

13
谷歌官方的 Material Design 图标仓库 https://github.com/google/material-design-icons/blob/master/navigation/drawable-xhdpi/ic_arrow_back_black_48dp.png - MrEngineer13
71
如果您正在使用最新版本的appcompat-v7(21.0.3或更高版本),您可以使用支持库中包含的R.drawable.abc_ic_ab_back_mtrl_am_alpha作为返回箭头图标。请注意,此方法仅适用于Android应用程序开发。 - Taeho Kim
25
请注意,getResources().getDrawable(...) 已被弃用。您应该使用 ContextCompat.getDrawable(context, ...) 替代。 - Quentin S.
7
无法工作,找不到R.drawable.abc_ic_ab_back_mtrl_am_alphaR.drawable.ic_action_back - Henrique de Sousa
10
从支持库获取“返回”图标: toolbar.setNavigationIcon(android.support.v7.appcompat.R.drawable.abc_ic_ab_back_material); - Bolein95
显示剩余14条评论

251

我看到很多答案,但我这个答案之前没有提到过。它适用于API 8及以上版本。

public class DetailActivity extends AppCompatActivity

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

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

    // add back arrow to toolbar
    if (getSupportActionBar() != null){
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    }
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // handle arrow click here
    if (item.getItemId() == android.R.id.home) {
        finish(); // close this activity and return to preview activity (if there is any)
    }

    return super.onOptionsItemSelected(item);
}

3
只有在将工具栏设置为操作栏时,它才有效。这不适用于独立的工具栏。 - Kuffs
25
给onOptionItemSelected()点赞。这篇回答完成了MrEngineer13没有提及的部分。 - Atul
2
谢谢,这对我很有用。似乎比使用点击监听器更好,我并不真的关心独立工具栏。 - Mike76
我如何更改箭头的颜色? - Dmitry
请注意,如果您的主题已经应用了工具栏,则无需创建自己的工具栏。 - Adrian Grygutis
显示剩余2条评论

245

有很多方法可以实现这个目标,以下是我最喜欢的方法:

布局:

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    app:navigationIcon="?attr/homeAsUpIndicator" />

活动:

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

toolbar.setNavigationOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // back button pressed
    }
});

22
在这个问题中,使用"theme"属性要比大多数其他建议更好。 - Pedro Loureiro
4
õ¢┐þö¿setNavigationOnClickListener()þÜäµø┐õ╗úµû╣µíêµÿ»Õ£¿onOptionsItemSelected()õ©¡µÀ╗Õèácase android.R.id.home:ÒÇé - eugene
1
case android.R.id.home 对我没用。所以经过一番搜索,你的答案解决了我的问题。谢谢。 - deejay
2
这是最真实的解决方案,特别是如果您想使用Android系统的默认返回图标。 - Nauman Aslam
在我看来,这是最佳答案,因为它不需要修改ActionBar状态。 - aeskreis
显示剩余5条评论

75

您可以使用工具栏的setNavigationIcon方法。 Android文档

mToolBar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha);

mToolBar.setNavigationOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        handleOnBackPress();
    }
});

1
你能否在你的回答中添加一些解释?仅有代码的回答在SO上是不受欢迎的。 - honk
1
иҜ·жіЁж„ҸпјҢж–№жі•setNavigationOnClickListener()е·ІеңЁAPIзә§еҲ«21еҸҠд»ҘдёҠж·»еҠ гҖӮ - Ali Mehrpour
3
在支持库23.2.0中,R.drawable.abc_ic_ab_back_mtrl_am_alpha已经被移除,请使用被接受的答案替代。 - Milan

38

如果您不想创建自定义的Toolbar,可以这样做

public class GalleryActivity extends AppCompatActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        ...  
        getSupportActionBar().setTitle("Select Image");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == android.R.id.home) {
            finish();
        }
        return super.onOptionsItemSelected(item);
    }
}                     

在你的 AndroidManifest.xml 文件中

<activity
    android:name=".GalleryActivity"
    android:theme="@style/Theme.AppCompat.Light">        
</activity>

你还可以将android:theme="@style/Theme.AppCompat.Light"放置在<application>标签中,这样就可以应用于所有活动。

enter image description here


2
感谢您的代码:if (item.getItemId() == android.R.id.home) - Adizbek Ergashev
完美解决方案 - tenTen

24
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    toolbar.setNavigationIcon(R.drawable.back_arrow); // your drawable
    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            onBackPressed(); // Implemented by activity
        }
    });

对于API 21+,android:navigationIcon

<android.support.v7.widget.Toolbar
    android:navigationIcon="@drawable/back_arrow"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"/>

21
如果您正在使用androidx.appcompat.app.AppCompatActivity,只需要使用以下代码:
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

那么只需要在 Manifest.xml 中定义父 Activity。

<activity
    android:name=".MyActivity"
    ...>
  <meta-data
      android:name="android.support.PARENT_ACTIVITY"
      android:value=".ParentActivity" />
</activity>

如果您正在使用工具栏(Toolbar),并且想要自定义行为,请使用:

<androidx.appcompat.widget.Toolbar
    android:id="@+id/toolbar" 
    app:navigationIcon="?attr/homeAsUpIndicator"
    .../>

而在你的Activity中:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        //....
    }
});

20

我使用了Google Developer 文档中的这种方法:

@Override
public void onCreate(Bundle savedInstanceState) {
  ...
  getActionBar().setDisplayHomeAsUpEnabled(true);
}

如果你遇到了空指针异常,可能与主题有关。尝试在清单中使用不同的主题或使用以下方法:

@Override
public void onCreate(Bundle savedInstanceState) {
  ...
  getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

然后在清单文件中,我设置当前活动的父活动:

<activity
        android:name="com.example.myapp.MyCurrentActivity"
        android:label="@string/title_activity_display_message"
     android:parentActivityName="com.example.myfirstapp.MainActivity" >
    <!-- Parent activity meta-data to support 4.0 and lower -->
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="com.example.myapp.MyMainActivity" />
</activity>

我希望这能对你有所帮助!


1
谷歌文档链接和 getSupportActionBar() 都起作用了。谢谢! - Rick

17

如果您曾经使用过 AppCompatActivity,并且因为不想自动获取它提供的 ActionBar,而希望将 Toolbar 分离出来,同时符合 Material Design 需求和 CoordinatorLayoutAppBarLayout 的要求,那么请考虑以下内容:

您仍然可以使用 AppCompatActivity,无需停止使用它以便在xml中使用<android.support.v7.widget.Toolbar>。只需按照以下方式关闭操作栏 样式

首先,在您的 styles.xml 中从 NoActionBar 主题中派生一个您喜欢的样式,我使用了 Theme.AppCompat.Light.NoActionBar,如下所示:

<style name="SuperCoolAppBarActivity" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/primary</item>

    <!-- colorPrimaryDark is used for the status bar -->
    <item name="colorPrimaryDark">@color/primary_dark</item>
    ...
    ...
</style>

在您的应用程序清单中,选择刚刚定义的子样式主题,如下所示:

    <activity
        android:name=".activity.YourSuperCoolActivity"
        android:label="@string/super_cool"
        android:theme="@style/SuperCoolAppBarActivity">
    </activity>
在你的Activity XML文件中,如果工具栏被定义为以下方式:
...
    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        />
...

接下来,这是重要的部分,你需要设置支持操作栏为你正在扩展的AppCompatActivity,这样你xml中的工具栏就变成了操作栏。我认为这是一种更好的方式,因为你可以简单地做许多ActionBar允许的事情,比如菜单、自动活动标题、项目选择处理等,而不需要添加自定义的单击处理程序等。

在你的Activity的onCreate覆盖方法中,执行以下操作:

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_super_cool);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);

    setSupportActionBar(toolbar);
    //Your toolbar is now an action bar and you can use it like you always do, for example:
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
} 

14

在 Kotlin 中,它会是这样的

private fun setupToolbar(){
    toolbar.title = getString(R.string.YOUR_TITLE)
    setSupportActionBar(toolbar)
    supportActionBar?.setDisplayHomeAsUpEnabled(true)
    supportActionBar?.setDisplayShowHomeEnabled(true)
}

// don't forget click listener for back button
override fun onSupportNavigateUp(): Boolean {
    onBackPressed()
    return true
}

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