安卓 - 标题栏中的返回按钮

140
在许多应用程序(日历、驱动器、Play 商店)中,当您点击按钮并进入新活动时,标题栏中的图标会变成返回按钮,但对于我正在制作的应用程序,它没有这样做。我如何使该图标带您返回到上一个屏幕?

在这里尝试在OnCreate示例中使用getSupportActionBar(),请参阅http://www.freakyjolly.com/how-to-add-back-arrow-in-android-activity/。 - Code Spy
26个回答

176

在标题栏中创建返回按钮只需两个简单的步骤:

首先,在您想要标题栏中有返回按钮的活动中,使用以下代码使应用程序图标可点击:

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

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

输入图像描述

第二步,在完成以上操作之后,您仍然需要创建代码以利用单击事件。为此,请注意,当您实际点击应用程序图标时,会调用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);

26
你的解释很好,但如果我没理解错的话,你在onOptionItemSelected方法中应该只调用finish();在你的情况下, startActivityForResult会启动第二个活动,当你从第二个活动返回时,你将被抛回到第一个活动(你在那里按了操作栏图标)。 - Yahya Arshad
11
此外,只有在item.getItemId()为android.R.id.home时才应该这样做。 - Alex Bitek
2
根据AS的提示:“方法调用'actionBar.setDisplayHomeAsUpEnabled(true)'可能会产生java.lang.NullPointerException异常”。 - statosdotcom
1
警告!使用ToolBar时,actionBar返回null并导致崩溃。请参见下面的答案。 - CoolMind
9
getActionBar()不能正常工作,我的应用程序会崩溃。使用getSupportActionBar()则可以正常工作。 - john k
显示剩余2条评论

66

使用此代码

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

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

  int id = item.getItemId();

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

1
getActionBar() 给了我一个 null 值;你知道为什么吗? - msysmilu
3
因为没有ActionBar,例如使用以下样式: false true - Paul Verest

60

我终于成功地将返回按钮添加到了操作栏/工具栏中。

@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 Çebi
2
同样的。谢谢你的回答。 - Maria
一样。其他答案都不行。这个应该是被采纳的答案。 - El Sushiboi

20

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

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


感谢介绍NavUtils! - AntonSack

13

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

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>

请参阅指定父Activity


2
这正是我一直在寻找的。你救了我的一天。非常感谢。 - Tashi Dendup

11

首先,您需要编写以下代码

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

接着在清单文件中添加这一行

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

我认为它会起作用


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

7

如果您的活动扩展了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()方法中调用该方法,这样手机上的返回按钮和工具栏上的箭头可以执行相同的操作。


1
这给了我提示要做什么。谢谢Ruzin。 - Umair

6
如果您正在使用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);

干杯。


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

这正是我正在寻找的,其他答案假设我想返回到X活动,但实际上我想返回到之前的活动。 - Denis Nutiu

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