【问题标题】:how to override action bar back button in android?如何覆盖android中的操作栏后退按钮?
【发布时间】:2013-01-04 10:55:07
【问题描述】:

我想在操作栏中自定义活动返回按钮,而不是在硬键返回按钮中。我已经覆盖了onBackPressed() 方法。它适用于我的模拟器后退按钮,但不适用于操作栏后退按钮。

我希望它发生在操作栏上。我该怎么做?

这是我的代码:

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

无论后按是否有效,我都使用过这个 toast,但实际的实现会发生变化,比如回到以前的活动。但这不适用于操作栏顶部的按钮(除了活动的标题)。

请任何人都可以指定我的问题。

【问题讨论】:

    标签: java android


    【解决方案1】:

    我想你想覆盖主页按钮的点击操作。您可以在 Activity 中像这样覆盖此功能。

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

    【讨论】:

    • Noah Ibrahim,实际上左上角有返回按钮,就像浏览器中的返回按钮一样。当我点击那个按钮时,我想回到以前的活动。不像你上面贴的代码。
    • 添加 super.onBackPressed();给它
    • 在我将 return true; 更改为 return super.onOptionsItemSelected(item) 后,这对我有用。然后您可以在用户单击操作栏后退按钮时发生一些事情,但仍保留按钮的相同功能。
    • 通过这种技术,后退箭头按钮响应较晚。意味着我必须等待一秒钟才能触发事件。按下时也不会在此按钮上显示效果的选择器
    • 对我不起作用。调试的时候发现home键的id和点击的按钮的id不一样。
    【解决方案2】:

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

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

    【讨论】:

    • case android.R.id.home 没有触发
    • @Trancer 如果你在 Fragment 中使用它,你应该在 Fragment 的 onCreate 方法中另外调用setHasOptionsMenu(true)
    【解决方案3】:

    要记住两件事,用户可以按返回按钮或按操作栏主页按钮。
    所以,如果你想将他重定向到同一个目的地,那么你可以这样做。

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

    这将使用户按任意键或操作栏按钮进入意图。

    【讨论】:

    • case android.R.id.home 没有触发
    • @Trancer,已经快 1.5 年多了。而且我现在不做android。我现在帮不了你了。对不起。
    • 那么解决办法是什么?
    【解决方案4】:

    对不起,我的回答迟了,但对于其他到达此页面并提出相同问题的人,我已经尝试过上述方法:

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

    但这未能抓住“返回”按钮的按下。

    最终我在https://stackoverflow.com/a/37185334/3697478 上找到了一个对我有用的方法,它可以在我使用“AppCompatActivity”支持库中的操作栏时覆盖“onSupportNavigateUp()”。 (对于较新的操作栏/工具栏库,有一个等效的“onNavigateUp()”。)

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

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

    【讨论】:

      【解决方案5】:
              @Override
              public boolean onOptionsItemSelected(MenuItem item) {
                      switch (item.getItemId()) {
                      case android.R.id.home:
                             finish();
                         break;
                      }
                      return true;
              }
      

      【讨论】:

      • 您可以将其添加为评论。它或多或少与接受的答案相同。
      【解决方案6】:

      我做到了,只用了两个步骤,

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

      【讨论】:

        【解决方案7】:

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

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

        (2) 覆盖子Activity内部的onSupportNavigateUp方法

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

        【讨论】:

          【解决方案8】:

          如果您想通过按下 ActionBar 主页按钮返回到 Activity 的上一个实例无需重新创建它,您可以重写 getParentActivityIntent 方法以使用来自后栈:

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

          编辑:
          您也可以通过
          获得相同的结果 将父 Activity 的 launchMode 设置为 singleTop。
          所以将android:launchMode="singleTop" 设置为清单中的父活动。
          或者,您可以将标志 FLAG_ACTIVITY_CLEAR_TOP 与 UP 意图一起使用。
          参考:Providing Up Navigation

          【讨论】:

            【解决方案9】:
            @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();
            }
            

            【讨论】:

              【解决方案10】:

              在bar中设置后退按钮有几种方法:

              1) 方法.setDisplayHomeAsUpEnabled(true); 会做到这一点,然后你可以简单地覆盖android.R.id.home

              2) 在 Android Manifest 中添加 &lt;meta-data android:name="android.support.PARENT_ACTIVITY" android:value="my.package.parrent" /&gt;,但在这种情况下,您不能覆盖 OnOptionsMenuSelected 中的 android.R.id.home

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2023-01-27
                相关资源
                最近更新 更多