将返回按钮添加到操作栏

Posted

技术标签:

【中文标题】将返回按钮添加到操作栏【英文标题】:Add back button to action bar 【发布时间】:2012-08-17 17:40:02 【问题描述】:

我一直在尝试向操作栏添加后退按钮。

我希望我的视图看起来像这样:

我想在操作栏左侧添加后退按钮。

我添加了这段代码

ActionBar actionBar = getActionBar();

actionBar.setDisplayHomeAsUpEnabled(true);

但它不起作用。

我该如何解决这个问题?

【问题讨论】:

Up 按钮与back 按钮不同。我认为添加后退按钮是anti android pattern 截图是一部iPhone。 Android 无法在此类设备上运行。 Android 有自己的后退按钮,用户始终可以使用;您不需要在操作栏中放置一个。 今天(2014 年)的许多应用程序在操作栏(例如 Instagram)中放置了一个备份/向上按钮,所以即使这是一种反模式,我也是如此。这显然是用户的需求(也许用户来自iPhone 在这方面看到更多好处) 请查看this answer 【参考方案1】:

设置后 actionBar.setHomeButtonEnabled(true);

添加以下代码:

@Override
public boolean onOptionsItemSelected(MenuItem item) 
    switch (item.getItemId()) 
        case android.R.id.home:
            // app icon in action bar clicked; goto parent activity.
            this.finish();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    

【讨论】:

这有点傲慢,您必须在执行该操作之前测试 menuItem == android.R.id.home(通常在 switch 语句以及该活动或片段的其他选项中)。对于 API >= 16,您也可以简单地 define the parent activity in the manifest 这让我的安卓应用崩溃了 @slier,我的应用程序也崩溃了,我发现操作栏返回 null 改用getSupportActionBar()【参考方案2】:

添加

actionBar.setHomeButtonEnabled(true);

然后添加以下内容

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

按照naXa 的建议,我在itemId 上添加了一项检查,以确保它在操作栏上有多个按钮时正常工作。

【讨论】:

在哪里检查所选选项是否为主页按钮? 我不确定。你可能会问一个具体的问题! :) 我的意思是,如果菜单中有其他选项(例如,帮助)它们也会被onOptionsItemSelected()处理,所以我们需要检查menuItem.getItemId() == android.R.id.home 你是对的!谢谢你...我会立即修复代码【参考方案3】:

这个对我有用:

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_your_activity);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    // ... other stuff


@Override
public boolean onSupportNavigateUp()
    finish();
    return true;

当您使用 SupportActionBar 中的返回按钮时,会调用 onSupportNavigateUp() 方法。

【讨论】:

【参考方案4】:

设置后

 actionBar.setHomeButtonEnabled(true);

您必须在 AndroidManifest.xml 中配置父活动

<activity
    android:name="com.example.MainActivity"
    android:label="@string/app_name"
    android:theme="@style/Theme.AppCompat" />
<activity
    android:name="com.example.SecondActivity"
    android:theme="@style/Theme.AppCompat" >
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="com.example.MainActivity" />
</activity>

在这里查看更多信息http://developer.android.com/training/implementing-navigation/ancestral.html

【讨论】:

这是更干净的路线。此外,从 android 实现的良好链接。 我怀疑如果您的子活动有多个父活动,这将不起作用。即不止一个 Activity 能够导航到子 Activity。【参考方案5】:

有两种方法可以解决这个问题。

选项 1:更新 Android 清单 如果设置 Activity 总是从同一个 Activity 调用,您可以在 Android Manifest 中建立关系。 Android 会自动在 ActionBar 中显示“返回”按钮

<activity
    android:name=".SettingsActivity"
    android:label="Setting Activity">
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="com.example.example.MainActivity" />
</activity>

选项 2:更改 ActionBar 的设置 如果你不知道哪个Activity会调用Settings Activity,你可以这样创建。首先在扩展 ActionBarActivity 的活动中(确保您的 @imports 与您正在寻找的兼容性级别相匹配)。

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_settings_test);
    ActionBar actionBar = getSupportActionBar();
    actionBar.setHomeButtonEnabled(true);
    actionBar.setDisplayHomeAsUpEnabled(true);

然后,检测“后退按钮”按下并告诉 Android 关闭当前打开的 Activity。

@Override
public boolean onOptionsItemSelected(MenuItem item) 
    switch (item.getItemId()) 
        case android.R.id.home:
            // app icon in action bar clicked; goto parent activity.
            this.finish();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    

应该这样做!

【讨论】:

【参考方案6】:

首先使用这个:

ActionBar bar = getSupportActionBar();
bar.setDisplayHomeAsUpEnabled(true);

然后在onOptionsItemSelected方法中设置按钮点击的操作

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

【讨论】:

下面应该有吗? @Override public boolean onCreateOptionsMenu(Menu menu) return super.onCreateOptionsMenu(menu); 如果您需要菜单中的选项,那么它应该是,否则不重要。 我正在使用 AppCompatActivity,并且有 onOptionsItemSelected 但是没有调用案例case android.R.id.home:,有什么提示吗? 所有方法都不适用于我的情况,因为我在使用 Fragment【参考方案7】:

您需要在onOptionsItemSelected 方法中检查menuItem.getItemId()android.R.id.home

Android Sherlock ActionBar Up button 的副本

【讨论】:

【参考方案8】:

更简单更好: 对于 API >= 16

只需在 Manifest 中为每个活动添加“parentActivityName”。后退按钮将自动将您带到父活动。

<activity
        android:name="com.example.myfirstapp.DisplayMessageActivity"
        android:label="@string/title_activity_display_message"
        android:parentActivityName="com.example.myfirstapp.MainActivity" >

【讨论】:

这对我不起作用。它在 Actionbar 上创建一个后退按钮,然后转到父 Activity。但父 Activity 不起作用。 @c-an 你可以重写onOptionsItemSelected方法并为itemId android.R.id.home设置onBackPressed【参考方案9】:

使用此按钮显示后退按钮并移至上一个活动,

final ActionBar actionBar = getSupportActionBar();
        assert actionBar != null;
        actionBar.setDisplayHomeAsUpEnabled(true);
        actionBar.setHomeAsUpIndicator(R.drawable.back_dark);


@Override
    public boolean onOptionsItemSelected(final MenuItem item) 

        switch (item.getItemId()) 
            case android.R.id.home:
                onBackPressed();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        
    

【讨论】:

【参考方案10】:

如果其他人需要解决方案

@Override
public boolean onOptionsItemSelected(MenuItem item) 
    int id = item.getItemId();

    if (id == android.R.id.home) 
        onBackPressed();
    

    return super.onOptionsItemSelected(item);

【讨论】:

【参考方案11】:

在 onCreate() 方法中加入这一行

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

然后重写这个方法

 @Override
    public boolean onSupportNavigateUp()
        finish();
        return true;
    

【讨论】:

以上是关于将返回按钮添加到操作栏的主要内容,如果未能解决你的问题,请参考以下文章

将目标添加到导航栏中的库存返回按钮

iOS 导航栏-返回按钮-自定义

斯威夫特 Xcode 11.4。将返回按钮添加到 TableView 导航项

如何删除和添加导航栏上的“返回按钮”

在操作栏上按“向上导航按钮”并返回到父活动时出错

如何为 A Person View Controller 的导航栏添加返回按钮?