【问题标题】:Add back button to action bar将返回按钮添加到操作栏
【发布时间】:2012-08-17 17:40:02
【问题描述】:

我一直在尝试向操作栏添加后退按钮。

我希望我的视图看起来像这样:

我想在操作栏左侧添加后退按钮。

我添加了这段代码

ActionBar actionBar = getActionBar();

actionBar.setDisplayHomeAsUpEnabled(true);

但它不起作用。

我该如何解决这个问题?

【问题讨论】:

  • Up 按钮与back 按钮不同。我认为添加后退按钮是anti Android pattern
  • 截图是一部iPhone。 Android 无法在此类设备上运行。 Android 有自己的后退按钮,用户始终可以使用;您不需要在操作栏中放置一个。
  • 今天(2014 年)的许多应用程序在操作栏(例如 Instagram)中放置了一个备份/向上按钮,所以即使这是一种反模式,我也是如此。这显然是用户的需求(也许用户来自iPhone 在这方面看到更多好处)
  • 请查看this answer

标签: android android-layout android-actionbar


【解决方案1】:

设置后 actionBar.setHomeButtonEnabled(true);

添加以下代码:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            // app icon in action bar clicked; goto parent activity.
            this.finish();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

【讨论】:

  • 这有点傲慢,您必须在执行该操作之前测试 menuItem == android.R.id.home(通常在 switch 语句以及该活动或片段的其他选项中)。对于 API >= 16,您也可以简单地 define the parent activity in the manifest
  • 这让我的安卓应用崩溃了
  • @slier,我的应用程序也崩溃了,我发现操作栏返回 null
  • 改用getSupportActionBar()
【解决方案2】:

添加

actionBar.setHomeButtonEnabled(true);

然后添加以下内容

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

按照naXa 的建议,我在itemId 上添加了一项检查,以确保它在操作栏上有多个按钮时正常工作。

【讨论】:

  • 在哪里检查所选选项是否为主页按钮?
  • 我不确定。你可能会问一个具体的问题! :)
  • 我的意思是,如果菜单中有其他选项(例如,帮助)它们也会被onOptionsItemSelected()处理,所以我们需要检查menuItem.getItemId() == android.R.id.home
  • 你是对的!谢谢你...我会立即修复代码
【解决方案3】:

这个对我有用:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_your_activity);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    // ... other stuff
}

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

当您使用 SupportActionBar 中的返回按钮时,会调用 onSupportNavigateUp() 方法。

【讨论】:

    【解决方案4】:

    设置后

     actionBar.setHomeButtonEnabled(true);
    

    您必须在 AndroidManifest.xml 中配置父活动

    <activity
        android:name="com.example.MainActivity"
        android:label="@string/app_name"
        android:theme="@style/Theme.AppCompat" />
    <activity
        android:name="com.example.SecondActivity"
        android:theme="@style/Theme.AppCompat" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.MainActivity" />
    </activity>
    

    在这里查看更多信息http://developer.android.com/training/implementing-navigation/ancestral.html

    【讨论】:

    • 这是更干净的路线。此外,从 android 实现的良好链接。
    • 我怀疑如果您的子活动有多个父活动,这将不起作用。即不止一个 Activity 能够导航到子 Activity。
    【解决方案5】:

    有两种方法可以解决这个问题。

    选项 1:更新 Android 清单 如果设置 Activity 总是从同一个 Activity 调用,您可以在 Android Manifest 中建立关系。 Android 会自动在 ActionBar 中显示“返回”按钮

    <activity
        android:name=".SettingsActivity"
        android:label="Setting Activity">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.example.MainActivity" />
    </activity>
    

    选项 2:更改 ActionBar 的设置 如果你不知道哪个Activity会调用Settings Activity,你可以这样创建。首先在扩展 ActionBarActivity 的活动中(确保您的 @imports 与您正在寻找的兼容性级别相匹配)。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_settings_test);
        ActionBar actionBar = getSupportActionBar();
        actionBar.setHomeButtonEnabled(true);
        actionBar.setDisplayHomeAsUpEnabled(true);
    }
    

    然后,检测“后退按钮”按下并告诉 Android 关闭当前打开的 Activity。

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                // app icon in action bar clicked; goto parent activity.
                this.finish();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
    

    应该这样做!

    【讨论】:

      【解决方案6】:

      首先使用这个:

      ActionBar bar = getSupportActionBar();
      bar.setDisplayHomeAsUpEnabled(true);
      

      然后在onOptionsItemSelected方法中设置按钮点击的操作

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

      【讨论】:

      • 下面应该有吗? @Override public boolean onCreateOptionsMenu(Menu menu) { return super.onCreateOptionsMenu(menu); }
      • 如果您需要菜单中的选项,那么它应该是,否则不重要。
      • 我正在使用 AppCompatActivity,并且有 onOptionsItemSelected
        但是没有调用案例case android.R.id.home:,有什么提示吗?
      • 所有方法都不适用于我的情况,因为我在使用 Fragment
      【解决方案7】:

      您需要在onOptionsItemSelected 方法中检查menuItem.getItemId()android.R.id.home

      Android Sherlock ActionBar Up button 的副本

      【讨论】:

        【解决方案8】:

        更简单更好: 对于 API >= 16

        只需在 Manifest 中为每个活动添加“parentActivityName”。后退按钮将自动将您带到父活动。

        <activity
                android:name="com.example.myfirstapp.DisplayMessageActivity"
                android:label="@string/title_activity_display_message"
                android:parentActivityName="com.example.myfirstapp.MainActivity" >
        

        【讨论】:

        • 这对我不起作用。它在 Actionbar 上创建一个后退按钮,然后转到父 Activity。但父 Activity 不起作用。
        • @c-an 你可以重写onOptionsItemSelected方法并为itemId android.R.id.home设置onBackPressed
        【解决方案9】:

        使用此按钮显示后退按钮并移至上一个活动,

        final ActionBar actionBar = getSupportActionBar();
                assert actionBar != null;
                actionBar.setDisplayHomeAsUpEnabled(true);
                actionBar.setHomeAsUpIndicator(R.drawable.back_dark);
        
        
        @Override
            public boolean onOptionsItemSelected(final MenuItem item) {
        
                switch (item.getItemId()) {
                    case android.R.id.home:
                        onBackPressed();
                        return true;
                    default:
                        return super.onOptionsItemSelected(item);
                }
            }
        

        【讨论】:

          【解决方案10】:

          如果其他人需要解决方案

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

          【讨论】:

            【解决方案11】:

            在 onCreate() 方法中加入这一行

            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            

            然后重写这个方法

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

            【讨论】:

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