处理操作栏上按钮的正确方式是什么?

27

我使用ActionBarSherlock(尽管我认为这并不重要)。

我有一个主活动和一个关于活动。 我想让“关于”活动通过其徽标显示返回箭头,并执行适当的动画等。 我不知道如何正确地做到这一点。

目前,我在onOptionsMenuItemSelected下启动主活动,当按下Up / Home按钮时,但这是一个hacky的方法,而且效果不好。 它播放错误的动画,并且处理多任务处理能力差。

我应该如何正确设置此功能?

这是我的主活动中启动“关于”部分的代码:

Intent aboutIntent = new Intent(MainActivity.this, About.class);
MainActivity.this.startActivity(aboutIntent);

这是我的“关于”页面:

package com.stevenschoen.test;

import android.content.Intent;
import android.os.Bundle;

import com.actionbarsherlock.app.SherlockActivity;
import com.actionbarsherlock.view.MenuItem;

public class About extends SherlockActivity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.about);

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowTitleEnabled(false);
    }

    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {

            case android.R.id.home:
                // app icon in action bar clicked; go home
                Intent intentHome = new Intent(this, MainActivity.class);
                intentHome.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(intentHome);
                return true;

            default:
                return super.onOptionsItemSelected(item);
        }
    }
}
7个回答

38

你也尝试过这个吗?(取自 Android 网站这里):

在清单文件中,对于每个需要前往主活动的 X 活动,请添加以下代码:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    // Respond to the action bar's Up/Home button
    case android.R.id.home:
        NavUtils.navigateUpFromSameTask(this);
        return true;
    }
    return super.onOptionsItemSelected(item);
}

并将此添加到其清单 XML 标记中:

<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.activities.MainActivity" />

如果您仍需要在主活动中保持相同的状态,请改用以下代码:

Intent intent = NavUtils.getParentActivityIntent(this); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP); 
NavUtils.navigateUpTo(this, intent);

如果API版本为16或更高,则可以添加一个属性 parentActivityName,其中包括指向主活动的路径,而不是元数据。


如果它是一个片段,怎么办?该如何处理? - user2056563
@user2056563类似的方式。当您需要活动时,使用“getActivity”,并在片段的“onCreate”中使用“setHasOptionsMenu(true)”。不要忘记调用片段的“onCreateOptionsMenu”方法的“super.onCreateOptionsMenu”(我在最后调用它,但我认为在开头也可以)。 - android developer
1
@Bhargav 哦,你的意思是它是 API 16 而不是 11。好的,我会修复这个问题。谢谢。 - android developer
Kotlin: intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP) - Morgz
@Morgz 对我来说似乎是一样的。 - android developer
显示剩余3条评论

14

我发现我的问题根源是一段时间前我对清单文件所做的更改:我添加了以下行:

android:launchMode="singleInstance"

所以我的主活动不会重新启动。更改为:

android:launchMode="singleTask"

我解决了我的问题,因此能够删除所有的 onOptionsItemSelected 相关内容。我知道有些东西不对劲,Android 应该能够更好地处理这个问题,而我是正确的。检查清单文件 :P


那么使用你发布的代码会清空除了主活动(也是第一个活动)之外的所有活动吗? - android developer
Android文档表示:“单任务(singleTask)和单实例(singleInstance)模式不适用于大多数应用程序,因为它们会导致用户不熟悉的交互模型,并且与大多数其他应用程序非常不同。” http://developer.android.com/guide/topics/manifest/activity-element.html - user3533716

12

你可以使用代码或XML处理操作栏按钮。

查看以下代码

如果你想以编程方式添加它,请在 onCreate() 方法中添加这一行。

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

重写这个方法 onSupportNavigateUp()

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

或者,非程序化的方法是将元数据添加到清单文件中,如下所示:

<activity android:name="Current Activity"
        android:parentActivityName="Activity you want to open">
    </activity>

注意: 确保 Actionbar 不为 null。


10

在您的onCreate(Bundle savedInstanceState)中,执行以下操作

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

然后在您的onOptionsItemSelected(MenuItem item)中执行以下操作

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            // go to previous screen when app icon in action bar is clicked
            Intent intent = new Intent(this, PreviousActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(intent);
            return true;
    }
    return super.onOptionsItemSelected(item);
}

3
我有的就是这个。它的功能不像谷歌的“返回”按钮那样。它会播放启动新活动的动画(而不是返回上一个活动)。 - Steven Schoen
这对我来说很好用。也许你应该发布你的代码?你导入了正确的“MenuItem”吗?你是否扩展了“SherlockActivity”?我不知道还有什么建议哈哈。 - Alex Lockwood
@D_Steve595 我也遇到了同样的问题。你最终解决了如何使动画与普通返回按钮相同的问题吗? - theblang

5

对于那些只想回到上一个活动的人来说,这是最简单的解决方案:

public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            finish(); //this method close current activity and return to previous
            return true;
    }
    return super.onOptionsItemSelected(item);
}

0
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_settings2);
    //here is to put the up back button in the Activity
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
@Override
// here is the code to handle to go back to the activity which sent you to this current one
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if (id == android.R.id.home) {
        onBackPressed();
    }
    return super.onOptionsItemSelected(item);
}

-1

请确保您在清单文件中的android:minSdkVersion="11",APK 11中已包含向上的图标。我做了一个小样例,请尝试下面的链接,它可能会对您有所帮助,只需将其导入到您的工作空间即可。

http://www.mediafire.com/?hktdvts7yyduwv1


“up icon” 可以在 Api Level 11 之前使用 Google support。相反,您可以调用 getSupportActionBar().setDisplayHomeAsUpEnabled(true) - theblang

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