Android-标题栏中的“后退”按钮


111

在许多应用程序(日历,云端硬盘,Play商店)中,当您单击按钮并输入新活动时,标题栏中的图标会变成后退按钮,但是对于我正在开发的应用程序,它不会执行此操作。如何使该图标带您回到上一屏幕?


在此处的OnCreate示例中尝试getSupportActionBar()freakyjolly.com/how-to-add-back-arrow-in-android-activity
代码间谍

Answers:


145

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

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

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

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

在此处输入图片说明

其次,完成上述操作后,您仍然必须创建将利用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);

23
您解释得很好,但如果onOptionItemSelected没错,则应该调用finish();。在您的情况下,startActivityForResult将启动第二个活动,当您从第二个活动中按回去时,您将被退回到第一个活动(您在其中按了操作栏图标)
Yahya Arshad 2013年

8
此外,只有在item.getItemId()为android.R.id.home时,才应这样做
bitek 2015年

2
如AS所述:“方法调用'actionBar.setDisplayHomeAsUpEnabled(true)'可能会产生java.lang.NullPointerException”
statosdotcom,2016年

1
警告!使用ToolBar时,actionBar崩溃时返回null。请参阅下面的答案。
CoolMind

5
getActionBar()对我不起作用,应用程序崩溃了。getSupportActionBar()确实起作用。
约翰·克特吉克

60

使用此代码

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

之后,在onOptionsItemSelected方法中编写此代码

  int id = item.getItemId();

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

1
getActionBar()给我一个空; 你知道为什么吗?
msysmilu 2015年

3
因为没有ActionBar,例如,样式为<item name =“ android:windowActionBar”> false </ item> <item name =“ android:windowNoTitle”> true </ item>
Paul Verest

47

我终于设法正确地向操作栏/工具栏添加了返回按钮

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

3
这是唯一对我有用的答案。谢谢@LucyFair
ArdaÇebi18年

2
相同。谢谢您的回答。
玛丽亚

相同。其他答案均无效。这应该是公认的答案。
El Sushiboi

18

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

3.-重写onOptionsItemSelected并使用NavUtils.navigateUpFromSameTask()静态方法导航以引发堆栈。

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

但是,仅当您的应用是当前任务的所有者(即用户从您的应用开始此任务)时,才适合使用NavigationUpFromSameTask()。如果不是这样,并且您的活动是在属于另一个应用程序的任务中启动的,则向上导航应创建一个属于您应用程序的新任务,这需要您创建一个新的后退堆栈。


感谢您介绍NavUtils!
AntonSack 2015年

10

如果您的活动确实扩展了活动

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

            [...]
        }

        [...]
    }

没什么可做的,请参阅加法动作

[可选]要显式定义父活动,请像下面这样修改您的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>

请参阅指定父活动


1
这正是我一直在寻找的东西。你救了我的日子。非常感谢。
Tashi Dendup

6

如果您的活动扩展了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()即可使电话上的后退按钮和工具栏上的箭头起到相同的作用。


6

首先在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);
    }

6

首先,您需要编写此代码

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

然后在清单中添加此行

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

我认为它将起作用


5

如果您在android studio中使用新的5.1支持库,则可以在AppCompatActivity上使用它

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

干杯。


5

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

1.在以下位置为您的childActivity添加父项AndroidManifest.xml

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

2.激活childActivity中的后退按钮:

myActionOrActionSupportBar.setDisplayHomeAsUpEnabled(true);

为我工作,我希望它也对您有用。


仅当活动只能有一个父活动时才有效。对我来说就是这样。+1
MQoder

在我的情况下,不需要步骤2。
Thomio

5

经过一段美好的时光,我发现代码中的主要问题是主题选项,以下是向我展示工具栏的正确方法

首先在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);
}

对于家庭活动,请添加此

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

3

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

1)Stardard android兼容性

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

希望它能对这里的人有所帮助!


2

不使用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


这与支持库中包含的新工具栏小部件配合使用。谢谢!!
Clocker

2

您需要在清单文件中添加以下提到的代码。搜索要在其中添加后退箭头功能的活动。如果找到一个,那么就好或创建活动

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

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


2

其他答案没有提到您也可以在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" />

2

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

很有意思,但是您假设我们想回到MainActivity。您将如何重定向到以前的任何活动?
Mayid


1

也可以通过在应用清单中指定父活动而无需代码来完成。如果您想要活动B中的后退按钮将转到活动A,只需在清单中添加活动A作为活动B的父项即可。



1

我需要混合一些答案才能为我找到正确的答案,因为我的应用程序具有3个可以随时返回的活动。活动1>活动2>活动3。当我在activity3上执行某项操作时,后退按钮已正确备份到Activity2。但是,从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()


1

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

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.

0

您也可以简单地放入onBackPressed()onClick侦听器。这会使您的按钮像android应用中的默认“后退/向上”按钮一样工作!


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

0

这对我有用。假设有两个活动(Activityone,Activitytwo)

在ActivityTwo内部使用此代码

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

在Activityone上

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

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

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

结果是这样的

在此处输入图片说明


0
  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;
    }

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.