如何实现 Android ActionBar 的后退按钮?

我有一个带有列表视图的活动。当用户单击该项目时,项目“查看器”打开:

List1.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {


Intent nextScreen = new Intent(context,ServicesViewActivity.class);
String[] Service = (String[])List1.getItemAtPosition(arg2);


//Sending data to another Activity
nextScreen.putExtra("data", datainfo);
startActivityForResult(nextScreen,0);
overridePendingTransition(R.anim.right_enter, R.anim.left_exit);
}
});

这个工作很好,但是在操作栏上应用程序图标旁边的反向箭头不会被激活。我错过了什么吗?

242967 次浏览

确保活动中的 ActionBar 主按钮已经启用:

Android,API 5 + :

@Override
public void onBackPressed() {
...
super.onBackPressed();
}

ActionBarSherlock 和 App-Compat,API 7 + :

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

Android,API 11 + :

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

扩展 ActionBarActivity的示例 MainActivity:

public class MainActivity extends ActionBarActivity {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Back button
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}


@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
// API 5+ solution
onBackPressed();
return true;


default:
return super.onOptionsItemSelected(item);
}
}
}

这样所有你想要的活动都可以有背压。

Android,API 16 + :

Http://developer.android.com/training/implementing-navigation/ancestral.html

返回文章页面

<application ... >
...
<!-- The main/home activity (it has no parent activity) -->
<activity
android:name="com.example.myfirstapp.MainActivity" ...>
...
</activity>
<!-- A child of the main activity -->
<activity
android:name="com.example.myfirstapp.DisplayMessageActivity"
android:label="@string/title_activity_display_message"
android:parentActivityName="com.example.myfirstapp.MainActivity" >
<!-- The meta-data element is needed for versions lower than 4.1 -->
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.myfirstapp.MainActivity" />
</activity>
</application>

扩展 ActionBarActivity的示例 MainActivity:

public class MainActivity extends ActionBarActivity {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Back button
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}


@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);
}
}

Selvin 已经给出了正确的答案,这里,用漂亮的代码给出了解决方案:

public class ServicesViewActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// etc...
getActionBar().setDisplayHomeAsUpEnabled(true);
}


@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
NavUtils.navigateUpFromSameTask(this);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}

函数 NavUtils.navigateUpFromSameTask(this)要求您在 AndroidManifest.xml 文件中定义父活动

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

进一步阅读请参阅 给你

Android 注解:

@OptionsItem(android.R.id.home)
void homeSelected() {
onBackPressed();
}

资料来源: https://github.com/excilys/androidannotations

要启用 ActionBar 后退按钮,显然需要在活动中使用 ActionBar。 这是由您正在使用的主题设置的。您可以在 AndroidManfiest.xml中设置活动的主题。如果您正在使用例如 @android:style/Theme.NoTitleBar主题,则没有 ActionBar。在这种情况下,对 getActionBar()的调用将返回 null。所以一定要先有一个动作栏。

下一步是将 android:parentActivityName设置为您想要导航的活动,如果您按下后退按钮。这也应该在 AndroidManifest.xml中完成。

现在您可以在“ child”活动的 onCreate方法中启用后退按钮。

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

现在您应该实现后退按钮的逻辑。您只需在您的“ child”活动中覆盖 onOptionsItemSelected方法并检查后退按钮的 id 即 android.R.id.home

现在你可以触发的方法 NavUtils.navigateUpFromSameTask(this); 但是如果你没有指定的 android:parentActivityName在你的 AndroidManifest.xml这将崩溃你的应用程序。

有时候这就是你想要的,因为它提醒你你忘记了“某些东西”。因此,如果您想要防止这种情况,您可以使用 getParentActivityIntent()方法检查您的活动是否具有父级。如果返回 null,则没有指定父级。

在这种情况下,您可以触发 onBackPressed()方法,该方法的功能基本上与用户按设备上的后退按钮相同。一个不会让你的应用程序崩溃的好的实现是:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
if (getParentActivityIntent() == null) {
Log.i(TAG, "You have forgotten to specify the parentActivityName in the AndroidManifest!");
onBackPressed();
} else {
NavUtils.navigateUpFromSameTask(this);
}
return true;
default:
return super.onOptionsItemSelected(item);
}
}

请注意,用户看到的动画在 NavUtils.navigateUpFromSameTask(this);onBackPressed()之间是不同的。

这取决于你走哪条路,但我发现这个解决方案很有帮助,特别是如果你在所有活动中都使用基类的话。

AndroidManifest 文件:

    <activity android:name=".activity.DetailsActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="br.com.halyson.materialdesign.activity.HomeActivity" />
</activity>

添加细节活动:

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

是工作

我认为 onSupportNavigateUp()是做到这一点最简单和最好的方法

检查完整的解决方案在下面的堆栈溢出答案。链接: 点击这里查看完整代码

Https://stackoverflow.com/a/46903870/4489222

要做到这一点,只需要两个步骤,

步骤1: 转到 AndroidManifest.xml 并在 tag-android 中添加参数: ParentActivityName = “ . home. HomeActivity”

例如:

 <activity
android:name=".home.ActivityDetail"
android:parentActivityName=".home.HomeActivity"
android:screenOrientation="portrait" />

步骤2: 在 ActivityDetails 中为上一页/活动添加动作

例如:

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

下面的步骤足以让你按下返回按钮:

第一步: 这段代码应该在 Manifest.xml 中

<activity android:name=".activity.ChildActivity"
android:parentActivityName=".activity.ParentActivity"
android:screenOrientation="portrait">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activity.ParentActivity" /></activity>

第二步: 你不会给的

finish();

当你开始儿童活动时,在你的父母活动。

第三步: 如果您需要从子活动返回到父活动,那么您只需要为子活动提供这个代码。

startActivity(new Intent(ParentActivity.this, ChildActivity.class));
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

onCreated方法为新的 api。

OnCreate方法中添加以下内容:

if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

然后添加这个方法:

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

如果您正在使用工具栏,我也面临着同样的问题

  1. 在 AndroidManifest.xml 中
<activity android:name=".activity.SecondActivity" android:parentActivityName=".activity.MainActivity"/>
  1. 在第二活动中,添加这些..。
Toolbar toolbar = findViewById(R.id.second_toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

基于 Jared 的回答,我必须在几个活动中启用和实现操作栏后退按钮行为,并创建了这个 helper 类来减少代码重复。

public final class ActionBarHelper {
public static void enableBackButton(AppCompatActivity context) {
if(context == null) return;


ActionBar actionBar = context.getSupportActionBar();
if (actionBar == null) return;


actionBar.setDisplayHomeAsUpEnabled(true);
}
}

活动中的用法:

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


ActionBarHelper.enableBackButton(this);
}

我自己也在尝试这种方法,有一种方法对我很有效:


when(item.itemId) {
R.id.action_signup -> signup() //other menu item
android.R.id.home -> viewRoot.findNavController().navigateUp() //back
}


return super.onOptionsItemSelected(item)
}

我用的是喷气背包导航系统,所以需要使用导航控制器。

另一个选项是将辅助活动的 ParentActivityName 设置为应用程序 Manifest 文件中的 MainActivity

<activity
android:name=".ServiceViewActivity"
android:parentActivityName=".MainActivity"/>