如何覆盖Android中的操作栏后退按钮?


95

我想在操作栏中自定义活动后退按钮,而不是在硬键后退按钮中自定义。我已经重写了该onBackPressed()方法。它可以与我的模拟器后退按钮一起使用,但不能与操作栏后退按钮一起使用。

我希望它与操作栏一起发生。我怎样才能做到这一点?

这是我的代码:

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

我已经用了这个祝酒,无论是否按回去都可以,但是实际的实现方式有所变化,例如想回到上一个活动。但这不适用于操作栏顶部的按钮(活动标题除外)。

请任何人可以指定我这个问题。

Answers:


209

我认为您想覆盖主页按钮的单击操作。您可以在活动中像这样覆盖此功能。

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

1
诺亚·易卜拉欣(Noah Ibrahim),实际上在左上角有一个“返回”按钮,就像浏览器中的“返回”按钮一样。当我单击该按钮时,我想返回上一个活动。不像您上面发布的代码。
GK 2013年

4
添加super.onBackPressed(); 对其进行重新处理
2013年

2
我改成return true;,这对我有用return super.onOptionsItemSelected(item)。然后,当用户单击操作栏的后退按钮时,您可以使某些事情发生,但仍保留该按钮的相同功能。
kumaheiyama

通过此技术,后退箭头按钮响应较晚。意味着我必须等待一秒钟才能触发事件。按下该效果时也未在该按钮上显示选择器
Gopal Singh Sirvi 2015年

没为我工作。调试时,我发现“主页”按钮的ID和单击的按钮的ID不同。
viper

45

如果希望ActionBar后退按钮的行为与硬件后退按钮相同:

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

1
案件android.R.id.home未开除
交易员'17年

2
@Trancer(如果您在Fragment中使用它),还应该另外调用setHasOptionsMenu(true)fragment的onCreate方法
wilddev

10

请记住两件事,用户可以按“后退”按钮或按操作栏的“主页”按钮。
因此,如果要将他重定向到相同的目的地,则可以执行此操作。

@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没有开除
交易员'17年

@Trancer,已经快1.5年了。而且我现在不做android。我现在不能帮你。抱歉。
ssi-anik

那有什么解决方案?
GA1

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

2
您可以将其添加为评论。它与接受的答案大致相同。
Sufian 2014年

7

对不起,我的回答很晚,但是对于其他到达此页面并遇到相同问题的人,我已经尝试了以下方法:

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

但这未能捕捉到“返回”按钮的按下。

最终,我在https://stackoverflow.com/a/37185334/3697478上找到了一种对我有用的方法,该方法将覆盖“ onSupportNavigateUp()”,因为我正在使用“ AppCompatActivity”支持库中的操作栏。(较新的actionbar / toolbar库有一个等效的“ onNavigateUp()”。)

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

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


4

我只用了两个步骤就实现了

步骤1:转到AndroidManifest.xml并在标记中添加参数-android:parentActivityName =“。home.HomeActivity”

例如:

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

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

例如:

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

2

如果要通过按ActionBar主页按钮返回到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",在清单中将其设置为父活动。
或者,您可以将标志FLAG_ACTIVITY_CLEAR_TOP与UP配合使用。
参考:提供导航


2

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

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

(2)在子活动中覆盖onSupportNavigateUp方法

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

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)添加<meta-data android:name="android.support.PARENT_ACTIVITY" android:value="my.package.parrent" />Android清单,但在这种情况下您无法覆盖android.R.id.home在OnOptionsMenuSelected中。

..对于那些想知道为什么它不适合他们的人...

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.