标题栏中的 Android-Back 按钮

在许多应用程序(日历,驱动器,播放商店)中,当你点击一个按钮并输入一个新的活动时,标题栏中的图标会变成一个返回按钮,但是对于我正在开发的应用程序来说,它不会这样做。我如何使该图标带您回到上一个屏幕?

300619 次浏览

如果您正在使用 ActionBar,那么您将需要阅读本文档 Http://developer.android.com/reference/android/app/actionbar.html#setdisplayhomeasupenabled(boolean)

然后,您必须覆盖 onOptionsItemSelected (MenuItem)方法并查找要进入的 android.R.id.home 事件。然后您就知道用户已经单击了操作栏上的后退按钮

在标题栏中创建一个后退按钮有两个简单的步骤:

首先,使用活动中的以下代码使应用程序图标可以单击,您希望在其标题栏中有一个后退按钮:

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

添加上述代码后,您将看到应用程序图标左侧出现一个反箭头。

enter image description here

其次,在完成上述操作之后,您仍然需要创建能够利用 click 事件的代码。为此,请注意,当您实际单击应用程序图标时,将调用一个 onOptionsItemSelected方法。因此,要返回到前一个活动,请将该方法添加到您的活动中,并在其中放入将返回到前一个活动的 Intent代码。例如,假设您正在尝试的 回去活动被称为 MyActivity。要回到这个问题,请按如下方式编写该方法:

public boolean onOptionsItemSelected(MenuItem item){
Intent myIntent = new Intent(getApplicationContext(), MyActivity.class);
startActivityForResult(myIntent, 0);
return true;
}

就是这样!

(在 Android 开发者 API 中,它建议在清单中添加一些东西,比如 android:parentActivityName。但这对我似乎不起作用。上述方法更简单可靠。)

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

在你的活动中

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

1.-将活动添加到 AndroidManifest.xml 并确保提供元数据:

<activity
android:name="com.example.myfirstapp.DisplayMessageActivity"
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.myfirstapp.MainActivity" />
</activity>

2.-在活动的 onCreate 方法中添加以下代码:

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

重写 onOptionsItemSelected 并使用 NavUtils.NavateUpFromSameTask ()静态方法导航抛出堆栈。

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

但是,只有当您的应用程序 是当前任务的所有者(即用户开始执行此任务 如果不是这样,并且你的活动是在一个 任务属于不同的应用程序,然后导航向上应该创建 属于您的应用程序的新任务,这需要您创建一个 新的备用堆栈。

用这个密码

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

然后用 onOptionsItemSelected方法写这段代码

  int id = item.getItemId();


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

我终于设法正确地将后退按钮添加到操作栏/工具栏

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


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


return super.onOptionsItemSelected(item);
}


public boolean onCreateOptionsMenu(Menu menu) {
return true;
}

不使用 ActionBarActivity的轻量级版本仍然具有相同的行为:

public class ToolbarConfigurer implements View.OnClickListener {
private Activity activity;


public ToolbarConfigurer(Activity activity, Toolbar toolbar, boolean displayHomeAsUpEnabled) {
toolbar.setTitle((this.activity = activity).getTitle());
if (!displayHomeAsUpEnabled) return;
toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
toolbar.setNavigationOnClickListener(this);
}


@Override
public void onClick(View v) {
NavUtils.navigateUpFromSameTask(activity);
}
}

用法: 将 new ToolbarConfigurer(this, (Toolbar) findViewById(R.id.my_awesome_toolbar), true);放在 onCreate中。

您也可以简单地将 onBackPressed()放到 onClick 侦听器中。这使得你的按钮就像安卓应用程序中默认的“备份”按钮一样!

如果您正在 android 工作室中使用新的5.1支持库,那么您可以在 AppCompatActivity 中使用它

 ActionBar actionBar = getSupportActionBar();
actionBar.setHomeButtonEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeAsUpIndicator(R.mipmap.ic_arrow_back_white_24dp);
actionBar.setDisplayShowHomeEnabled(true);

干杯。

最简单的方法和最佳实践,正如谷歌解释 在这里:

1. 在 AndroidManifest.xml中为您的子活动添加父节点:

<activity
android:name=".ChildActivity"
android:parentActivityName=".ParentActivity" >
</activity>

激活儿童活动中的后退按钮:

myActionOrActionSupportBar.setDisplayHomeAsUpEnabled(true);

对我有用,我希望对你也有用。

如果您的活动扩展了活动

public class YourActivity extends Activity {


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


getActionBar().setHomeButtonEnabled(true);


[...]
}


[...]
}

如果您的操作扩展了 AppCompatActivity

public class YourActivity extends AppCompatActivity {


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


getSupportActionBar().setHomeButtonEnabled(true);


[...]
}


[...]
}

没有更多的事情要做了,请参见“添加动作”

[ OPTION ]要明确定义父活动,可以像下面这样修改 Manifest.xml:

<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.YourActivity "
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.myfirstapp.MainActivity" />
</activity>
</application>

参见 指定父活动

您需要在清单文件中添加下面提到的代码。 搜索要在其中添加反向箭头功能的活动。 如果你找到一个那么罚款或创建活动

<activity android:name=".SearchActivity">


</activity>

然后在中间添加以下三行代码。

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

不要忘记在 onCreate () ; 方法中添加这段代码,您需要在其中使用反向箭头。

        Toolbar toolbar = (Toolbar) findViewById(R.id.searchToolbar);
setSupportActionBar(toolbar);
try{
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}catch(NullPointerException e){
Log.e("SearchActivity Toolbar", "You have got a NULL POINTER EXCEPTION");
}

这就是我解决问题的方法。 谢谢。

如果您的活动扩展了 AppCompatActivity,您需要像下面这样覆盖 onSupportNavigateUp()方法:

public class SecondActivity extends AppCompatActivity {


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
...
}


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


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

onBackPressed()方法中处理您的逻辑,并在 onSupportNavigateUp()中调用该方法,这样电话上的后退按钮和工具栏上的箭头就可以做同样的事情。

它也可以通过在应用程序清单中指定父活动来实现,而不需要编写代码 如果您希望在活动 B 中有一个返回按钮,该按钮将转到活动 A,只需在清单中将活动 A 添加为活动 B 的父级。

首先在 onCreate 函数中添加以下代码行

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

然后在代码中添加以下函数:

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


return super.onOptionsItemSelected(item);
}
Toolbar toolbar=findViewById(R.id.toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);


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


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

假设有两个活动(Activityone,Activitytwo)

在 Activity2中使用这个代码

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

第一次行动

//when you need to go second activity
startActivity(new Intent(Activityone.this, Activitytwo.class));

这应该包含在清单文件中的第二个活动中

<activity android:name=".Activitytwo"
android:parentActivityName=".Activityone"></activity>

结果是这样的

enter image description here

这对我有用 GetSupportActionBar () . setDisplayHomeAsUpEnable (false) ; 在此输入图像描述

首先,您需要编写这个代码

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

然后在清单中添加此行

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

我觉得会有用的

为了 Kotlin:

   override fun onOptionsItemSelected(item: MenuItem): Boolean {
onBackPressed();
return true;
}

我需要混合一些答案为我得到正确的答案,因为我的应用程序有3个活动,可以去和回在任何时间。活动1 > 活动2 > 活动3。当我在活动3上做一些事情时,后退按钮正确地退回到活动2。然而,从 Activity2,使用 finish(),它是回到 Activity3,而不是 Activity1。我正在扩展 AppCompatActivity。所以,我的解决办法是:

public class Activity2 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
...


getSupportActionBar().setHomeButtonEnabled(true);
}
}

在 AndroidManifest.xml 上:

<activity android:name=".activities.Activity2"
android:parentActivityName="com.example.appname.activities.Activity1">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.appname.activities.Activity1" />
</activity>

最后,我菜单上的操作按钮(操作栏) :

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


case android.R.id.home:
NavUtils.navigateUpFromSameTask(this);
return true;


}


return super.onOptionsItemSelected(item);


}

使用 NavUtils.navigateUpFromSameTask(this);对我有用,而不是 finish()

其他的答案没有提到您也可以在 Toolbar小部件的 XML 中设置这一点:

app:navigationIcon="?attr/homeAsUpIndicator"

例如:

<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:navigationIcon="?attr/homeAsUpIndicator"
app:popupTheme="@style/AppTheme.PopupOverlay"
app:title="@string/title_activity_acoustic_progress" />

只是分享一些对我有帮助,对其他人可能有用的东西。虽然这里的大多数答案都是正确的,但是使用 getActionBar().setDisplayHomeAsUpEnabled(true);,这对我来说不起作用。我遇到的问题是,我试图手动创建第二个 Activity,但是涉及到更多的细节。
真正解决我的问题的是遵循 Android Developers 教程(https://developer.android.com/training/basics/firstapp/starting-activity) ,使用 Android Studio 自己的工具创建第二个活动:

Create the second activity
1. In the Project window, right-click the app folder and select New > Activity > Empty Activity.
2. In the Configure Activity window, enter "DisplayMessageActivity" for Activity Name and click Finish (leave all other properties set to the defaults).
Android Studio automatically does three things:
- Creates the DisplayMessageActivity file.
- Creates the corresponding activity_display_message.xml layout file.
- Adds the required <activity> element in AndroidManifest.xml.

我看到了这么多复杂的答案,所以这是我的代码。在这里工作。您可以通过两种方式实现这一点。

1)标准机器人兼容性

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.NavUtils;


import android.view.MenuItem;
import android.view.View;


public class EditDiscoveryActivity extends AppCompatActivity {


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


/*toolbar.setNavigationIcon(R.drawable.ic_arrow_white_24dp);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});*/
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
}


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


}

2)使用自定义图标

如果您想在注释中使用代码,只需将此文件添加到可绘制文件 ic _ Arrow _ white _ 24dp. xml 中即可

<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#ffffff"
android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z"/>
</vector>

用这个密码。

toolbar.setNavigationIcon(R.drawable.ic_arrow_white_24dp);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});

希望对这里的一些人有所帮助!

经过一段时间的质量,我发现,主题选项是我的代码中的主要问题,下面是正确的方式来显示我的工具栏

在 AndroidManifest 文件中,首先必须更改主题样式

Theme.AppCompat.Light.DarkActionBar
to
Theme.AppCompat.Light.NoActionBar

然后在您的活动 xml 中,您需要调用您自己的工具栏,如

<androidx.appcompat.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/colorPrimary"
android:id="@+id/toolbar"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
android:elevation="4dp"/>

然后在 Java 文件中调用这个工具栏

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

对于显示 U 的工具栏,应该检查 null 以避免 NullPointerException

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

对于 Home 活动,返回添加以下内容

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


return super.onOptionsItemSelected(item);
}

或者你想要的活动回来

public boolean onOptionsItemSelected(MenuItem item){
Intent myIntent = new Intent(getApplicationContext(), YourActivity.class);
startActivityForResult(myIntent, 0);
return true;
}

2020年你需要做的就是:
(考虑到您希望返回 MainActivity)

protected void onCreate(Bundle savedInstanceState){
...
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}


public boolean onOptionsItemSelected(MenuItem item) {
Intent myIntent = new Intent(getApplicationContext(), MainActivity.class);
startActivityForResult(myIntent, 0);
return true;
}
  protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.YourxmlFileName);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}


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


if (id==android.R.id.home) {
finish();
return true;
}
return false;
}