如何在安卓系统中覆盖操作栏返回按钮?

103

我想自定义动作栏中的返回按钮,而不是硬键盘上的返回按钮。我已经重写了onBackPressed()方法。它可以使用模拟器的返回按钮,但不能使用动作栏中的返回按钮。

我希望这个功能可以在动作栏中实现。我该怎么做?

以下是我的代码:

@Override
public void onBackPressed() {
    Toast.makeText(getApplicationContext(),"Back button clicked", Toast.LENGTH_SHORT).show(); 
    return;
}

无论后退按键是否工作,我都使用了这个toast,但实际的实现方式会发生改变,比如返回到上一个activity。但是在action bar顶部的按钮(标题旁边)中,这种方法不起作用。

请问有人可以告诉我问题出在哪里吗?

10个回答

225

我认为你想要覆盖主页按钮的点击操作。你可以在你的活动中像这样覆盖这个功能。

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case android.R.id.home:
        Toast.makeText(getApplicationContext(),"Back button clicked", Toast.LENGTH_SHORT).show(); 
        break;
    }
    return true;
}

2
Noah Ibrahim,实际上在左上角有一个返回按钮,就像浏览器中的返回按钮一样。当我点击该按钮时,我想要返回到先前的活动,而不是像您上面发布的代码那样。 - G K
4
在其中添加 super.onBackPressed();。 - redestructa
2
在我将return true;改为return super.onOptionsItemSelected(item);之后,这对我起作用了。然后,当用户点击操作栏返回按钮时,你可以让某些事情发生,但仍保留按钮的相同功能性。 - kumaheiyama
通过这种技术,返回箭头按钮响应较慢。这意味着我必须等待一秒钟才能触发事件。同时,在按下该按钮时未出现选择器以产生效果。 - Gopal Singh Sirvi
对我没用。当我进行调试时,我发现主页按钮的ID和被点击的按钮的ID不同。 - viper

51
如果您希望ActionBar返回按钮的行为与硬件返回按钮相同:
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
            if (item.getItemId() == android.R.id.home) {
                    onBackPressed();
                    return true;
            }
            return false;
    }

2
android.R.id.home 的情况未触发。 - Trancer
4
@Trancer 如果您在 Fragment 中使用它,应在片段的 onCreate 方法中另外调用setHasOptionsMenu(true) - wilddev

11

请记住两件事,用户可以按返回按钮或按操作栏主页按钮。
因此,如果您想将其重定向到相同的目标,则可以这样做。

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

@Override
public void onBackPressed() {
    super.onBackPressed();
    Intent intent = new Intent(CurrentActivity.this, NextActivity.class);
    startActivity(intent);
    finish();
}

这将使用户通过按任意一个键或操作栏按钮转到意图。


android.R.id.home 的情况未触发。 - Trancer
@Trancer,已经过去了1.5年多了。我现在不做安卓了,无法帮助你。抱歉。 - ssi-anik
那么,解决方案是什么? - GA1

10

抱歉回复晚了,但是对于其他遇到同样问题的人,我已经尝试了上述方法:

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

但是这种方法无法捕捉“后退”按钮的按下。

最终,我在https://dev59.com/SmUo5IYBdhLWcg3w5Syl#37185334上找到了适合我的方法,即覆盖“AppCompatActivity”支持库中的“onSupportNavigateUp()”。(新版actionbar/toolbar库有一个等效的“onNavigateUp()”)

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

我在清单文件中删除了“android:parentActivityName=".MainActivity"”部分。

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

2
你本可以将它添加为注释。这与被接受的答案基本相同。 - Sufian

6

(1) 为你的子活动添加父活动(AndroidManifest.xml)

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

(2) 在子 Activity 中重写 onSupportNavigateUp 方法

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

4

我通过简单的两个步骤实现了这一点:

第一步:打开AndroidManifest.xml文件,在中添加参数 - android:parentActivityName=".home.HomeActivity"

例如:

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

第二步:在ActivityDetail中添加你的上一个页面/活动的操作。
例如:
 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
       case android.R.id.home:
           onBackPressed();
           return true;
    }
    return super.onOptionsItemSelected(item);
 }

2

如果您想通过按下操作栏的主页按钮返回到上一个 Activity,而不用重新创建它,则可以重写 getParentActivityIntent 方法以使用来自后退堆栈的方法:

@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
@Override
public Intent getParentActivityIntent() {
      return super.getParentActivityIntent().addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
}

编辑:
您还可以通过将父活动的launchMode设置为singleTop来实现相同的结果。
因此,请在清单文件中的父活动中设置android:launchMode="singleTop"
或者,您可以使用UP意图和FLAG_ACTIVITY_CLEAR_TOP标志。
参考:提供向上导航


0
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == android.R.id.home) {
        onBackPressed();
        return true;
    }
    //noinspection SimplifiableIfStatement
    if (id == R.id.signIn) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}
///////////////////
@Override
public void onBackPressed() {
    super.onBackPressed();
    finish();
}

0

有几种方法可以设置返回按钮:

1)使用.setDisplayHomeAsUpEnabled(true); 方法,然后简单地覆盖android.R.id.home

2)在Android清单中添加<meta-data android:name="android.support.PARENT_ACTIVITY" android:value="my.package.parrent" />,但是在这种情况下,您不能在OnOptionsMenuSelected中覆盖android.R.id.home

.. 对于那些想知道为什么它对他们不起作用的人...


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