在操作栏中添加返回按钮

64

我一直在尝试将返回按钮添加到操作栏中。

我想让我的视图看起来像这样:enter image description here

我想把返回按钮添加到操作栏的左边。

我添加了这段代码:

ActionBar actionBar = getActionBar();

actionBar.setDisplayHomeAsUpEnabled(true);

但它不起作用。

我该如何修复?


5
“向上”按钮与“返回”按钮不同。我认为添加“返回”按钮违反了Android设计规范。 - Trung Nguyen
6
截图显示的是 iPhone。Android 无法运行在这些设备上。Android 有自己的返回按钮,始终对用户可用;你不需要将其放置在操作栏中。 - CommonsWare
3
现在的许多应用程序(2014年)在操作栏中放置了返回/上一级按钮(例如Instagram),尽管这可能是一种反模式,但显然用户需要它(也许从iPhone转来的用户会更加需要)。 - sports
请返回翻译后的文本:请查看此答案 - Amit Vaghela
11个回答

128

在调用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);
    }
}

15
在执行该操作之前,你需要测试一下 menuItem == android.R.id.home,这有点草率(通常在 switch 语句中与其他选项一起)。对于API >= 16,你还可以在清单文件中 定义父活动。请注意不要改变原本的含义。 - RedGlyph
1
这导致我的安卓应用程序崩溃了。 - slier
@slier,我的应用程序也崩溃了,我发现ActionBar返回为null。 - Akeshwar Jha
12
请使用 getSupportActionBar() 代替。 - John

54

添加

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的检查,以便在操作栏上有多个按钮的情况下能够正常工作。


选项中哪里可以检查是否选择了主页按钮? - naXa stands with Ukraine
我不确定。你可以就此提出一个具体的问题! :) - clami219
我的意思是,如果菜单中有其他选项(例如,帮助),它们也将由onOptionsItemSelected()处理,因此我们需要检查menuItem.getItemId() == android.R.id.home - naXa stands with Ukraine
你说得对!谢谢...我会立即修复代码。 - clami219

27

这个对我有用:

@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()方法。


24

设置完成后

 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>

点击此处获取更多信息。


1
这是更简洁的路线。同时,这是一个很好的从Android实现的链接。 - Kalel Wade
1
我怀疑如果您的子活动有多个父活动,这将无法正常工作。也就是说,有多个活动能够导航到子活动。 - Scott Ferguson

10

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

选项1:更新Android清单 如果设置活动始终从同一活动调用,则可以在Android清单中建立关系。 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将调用设置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);
    }
}

应该就这样了!


7
首先使用这个:
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);
  }
 }

以下是程序相关内容的翻译:是否应该有以下内容?`@Overridepublic boolean onCreateOptionsMenu(Menu menu) { return super.onCreateOptionsMenu(menu); }` - Shrenik
如果菜单需要选项,则应该提供,否则不重要。 - Arunendra
我正在使用AppCompatActivity,并且有onOptionsItemSelected方法,但是case android.R.id.home:这个情况没有被调用,有什么提示吗? - Shrenik
所有的方法在我的情况下都不起作用,因为我正在使用Fragment。 - Ashish Shahi

6

更加简单和优秀:

针对API >= 16版本,只需在清单文件中的每个活动中添加“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
@c-你可以重写onOptionsItemSelected方法,并为itemId android.R.id.home设置onBackPressed。 - AnupamChugh

6
使用此功能可以显示返回按钮并返回上一个活动:
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);
        }
    }

6

5
如果有其他人需要解决方案
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();

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

    return super.onOptionsItemSelected(item);
}

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