【问题标题】:Display back button on action bar在操作栏上显示返回按钮
【发布时间】:2013-03-19 04:03:58
【问题描述】:

我试图在Action bar 上显示Back button 以移动上一页/活动或主页(第一次打开)。 而我做不到。

我的代码。

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

代码在onCreate

【问题讨论】:

  • 使用:getSupportActionBar().setDisplayHomeAsUpEnabled(true);

标签: android android-actionbar android-homebutton


【解决方案1】:

这是一个简单的显示返回按钮

actionBar.setDisplayHomeAsUpEnabled(true);

然后您可以在 onOptionsItemSelected 自定义返回事件

case android.R.id.home:
this.finish();
return true;

【讨论】:

  • 我在 onOptionsItemSelected(MenuItem item) 中添加了上述行,因为我已经有一个关于操作的菜单,因为我列出了用于重定向菜单选项的 ID,单击时主 ID 不起作用
  • 如果您遇到奇怪的行为(例如:您使用片段的后退按钮(R.id.home)并最终关闭活动),请确保您没有“android:noHistory " 设置在这个活动上,因为如果你这样做了,即使从片段返回到活动的“概述”也会完成它。
  • 确保您在 AndroidMenifest.xml 中设置了父活动,以使 R.id.home 按钮正常工作。
【解决方案2】:

我认为onSupportNavigateUp() 是最好和最简单的方法,请检查以下步骤。第 1 步是必须的,第 2 步有替代方案。

第 1 步显示返回按钮:onCreate() 方法中添加此行以显示返回按钮。

assert getSupportActionBar() != null;   //null check
getSupportActionBar().setDisplayHomeAsUpEnabled(true);   //show back button

第 2 步实现后退点击:覆盖此方法

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

您就完成了
或第 2 步替代方案:您可以将元数据添加到清单文件中的活动

<meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="MainActivity" />

编辑:如果你没有使用AppCompatActivity那么不要使用support这个词,你可以使用

getActionBar().setDisplayHomeAsUpEnabled(true); // In `OnCreate();`

// And override this method
@Override 
public boolean onNavigateUp() { 
     finish(); 
     return true; 
}

感谢@atariguy 的评论。

【讨论】:

  • 当您需要将数据发送回父 Activity 或想要在父 Activity 中保留 EditText 的值时,此解决方案非常有用。我尝试了onOptionsItemSelected 解决方案,但没有这样做。
  • 最佳解决方案+10。
  • 如果你没有使用Actionbar的支持库,修改如下:getActionBar().setDisplayHomeAsUpEnabled(true);@Override public boolean onNavigateUp(){ finish(); return true; }
  • 现象级的。 +1。简单的。优雅的。美丽的。 :)
  • 感谢您的帮助。通过使用清单,它不起作用,但使用它正在工作的代码
【解决方案3】:

奇迹发生在onOptionsItemSelected

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            // app icon in action bar clicked; go home
            Intent intent = new Intent(this, HomeActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(intent);
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

【讨论】:

  • 在我的情况下,我想在该页面中添加返回按钮,其中 onOptionsItemSelected(MenuItem item) 事件将不存在...还有其他解决方案吗??
  • 您应该首先在 onCreateMethod 中添加 getActionBar().setDisplayHomeAsUpEnabled(true); 以显示返回按钮
  • 我认为如果你这样做,即使你再次开始以前的活动,现在又多了一个实例,你也不会回去,你总是向前走,直到发生堆栈溢出,如果你继续足够长了。我认为 Igor 的回答是正确的,您应该使用 finish() 停止此活动,并让框架让您回到之前运行的活动实例。
  • 当用户点击返回按钮时使用this.onBackPressed();方法。
【解决方案4】:

官方解决方案

将这两个代码 sn-ps 添加到您的子活动中

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

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

将元数据和 parentActivity 添加到 manifest 以支持较低的 sdk。

 <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.SubActivity"
        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>

参考这里:http://developer.android.com/training/implementing-navigation/ancestral.html

【讨论】:

  • 注意:如果使用支持库来实现向后兼容,则需要使用“getSupportActionBar()”而不是“getActionBar()”。这是最完整、最官方的答案。
【解决方案5】:

将这些行添加到 onCreate()

android.support.v7.app.ActionBar actionBar = getSupportActionBar();
   actionBar.setHomeButtonEnabled(true);
   actionBar.setDisplayHomeAsUpEnabled(true);

在 onOptionItemSelected 中

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

希望这会对你有所帮助..!

【讨论】:

    【解决方案6】:

    试试这个代码,只有当你需要返回按钮时才考虑它。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //YOUR CODE
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    
        //YOUR CODE
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        onBackPressed();
        return true;
    }
    

    【讨论】:

      【解决方案7】:

      在您的onCreate 方法上添加:

      getSupportActionBar().setDisplayHomeAsUpEnabled(true);
      

      AndroidManifest.xml 中定义父活动(按下操作栏中的后退按钮后将调用的活动):

      在 Manifest 上的 &lt;activity&gt; 定义中,添加以下行:

      android:parentActivityName="com.example.activities.MyParentActivity"
      

      【讨论】:

      • 如果您希望支持 4.0 之前的设备,您只需要放入清单代码。不过,对于当前的库来说,第一段代码是一个更好的解决方案。
      【解决方案8】:

      在你的onCreate() 方法中添加这一行

      getSupportActionBar().setDisplayHomeAsUpEnabled(true);
      

      并且,在同一个Activity中,添加这个方法来处理按钮点击

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

      【讨论】:

        【解决方案9】:

        我知道我来晚了,但可以通过直接关注docs 来解决此问题。

        将元数据标签添加到AndroidManifest.xml(以便系统知道)

         <activity
                android:name=".Sub"
                android:label="Sub-Activity"
                android:parentActivityName=".MainChooser"
                android:theme="@style/AppTheme.NoActionBar">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".MainChooser" />
            </activity>
        

        接下来,启用MainActivity 中的后退(向上)按钮

            @Override 
            protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_my_child);
         
            // my_child_toolbar is defined in the layout file 
            Toolbar myChildToolbar =
                (Toolbar) findViewById(R.id.my_child_toolbar);
            setSupportActionBar(myChildToolbar);
         
            // Get a support ActionBar corresponding to this toolbar 
            ActionBar ab = getSupportActionBar();
         
            // Enable the Up button 
            ab.setDisplayHomeAsUpEnabled(true);
            } 
        

        而且,你们都准备好了!

        来源:Android Developer Documentation

        【讨论】:

          【解决方案10】:

          我知道上面有很多有用的解决方案,但是这次我看了这篇文章(当前Android Studio 2.1.2 with sdk 23)上面的一些方法不起作用。

          下面是我的子活动解决方案是 MapsActivity

          首先需要在

          中添加parentActivity

          AndroidManifest.xml

          像这样:

          <application ... >
              ...
              <!-- Main activity (which has no parent activity) -->
              <activity
                  android:name="com.example.myapp.MainActivity" ...>
                  ...
              </activity>
              <!-- A child of the main activity -->
              <activity
                  .....
                  android:parentActivityName=".MainActivity" >
                  <!-- Support Parent activity for Android 4.0 and lower -->
                  <meta-data
                      android:name="android.support.PARENT_ACTIVITY"
                      android:value="com.example.myapp.MainActivity" />
              </activity>
          </application>
          

          其次,确保你的子Activity扩展AppCompatActivity,而不是 片段活动。

          三、覆盖onOptionsItemSelected()方法

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

          希望这会有所帮助!

          【讨论】:

            【解决方案11】:

            这很简单,对我来说效果很好

            在 onCreate() 方法中添加这个

            getSupportActionBar().setHomeButtonEnabled(true);
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            

            在 oncreate() 方法之外添加这个

            @Override
            public boolean onOptionsItemSelected(MenuItem item) {
                onBackPressed();
                return true;
            }
            

            【讨论】:

              【解决方案12】:

              试试这个, 在你的 onCreate()

               getActionBar().setHomeButtonEnabled(true);
               getActionBar().setDisplayHomeAsUpEnabled(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);
                      }
                  }
              

              【讨论】:

                【解决方案13】:

                要做到这一点,只需两个步骤,

                第1步:转到AndroidManifest.xml并在&lt;activity&gt;标签中添加这个参数-android:parentActivityName=".home.HomeActivity"

                例子:

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

                第 2 步:在 ActivityDetail 中为上一页/活动添加您的 action

                例子:

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

                【讨论】:

                  【解决方案14】:

                  在onCreate方法中写入-

                  Toolbar toolbar = findViewById(R.id.tool);
                      setSupportActionBar(toolbar);
                      if (getSupportActionBar() != null) {
                          getSupportActionBar().setDisplayHomeAsUpEnabled(true);
                          getSupportActionBar().setDisplayShowHomeEnabled(true);
                      }
                  }
                  @Override
                  public boolean onSupportNavigateUp() {
                      onBackPressed();
                      return true;
                  }
                  @Override
                  public void onBackPressed() {
                      super.onBackPressed();
                      startActivity(new Intent(ActivityOne.this, ActivityTwo.class));
                      finish();
                  }
                  

                  这是xml文件-

                  <android.support.v7.widget.Toolbar
                  xmlns:android="http://schemas.android.com/apk/res/android"
                  android:layout_width="match_parent"
                  android:layout_height="?attr/actionBarSize"
                  android:background="@color/colorPrimary"
                  android:theme="@style/ThemeOverlay.AppCompat.Dark"
                  android:id="@+id/tool">
                  

                  并在styles.xml 中将其更改为

                  Theme.AppCompat.Light.NoActionBar
                  

                  这就是我们所要做的。

                  【讨论】:

                    【解决方案15】:

                    就我而言;我只需要像这样将android:parentActivityName attr 添加到我的活动中:

                    <activity
                     android:name=".AboutActivity"
                     android:label="@string/title_activity_about"
                     android:parentActivityName=".MainActivity" />
                    

                    后退按钮出现并按预期工作。

                    【讨论】:

                      【解决方案16】:

                      我就是这样解决的

                      @Override
                      public boolean  onOptionsItemSelected(MenuItem item){
                          switch (item.getItemId()) {
                              case android.R.id.home:
                                  onBackPressed();
                                  finish();
                                  return true;
                              default:
                                  return super.onOptionsItemSelected(item);
                          }
                      }
                      
                      @Override
                      public void onBackPressed(){
                          Intent backMainTest = new Intent(this,MainTest.class);
                          startActivity(backMainTest);
                          finish();
                      }
                      

                      【讨论】:

                        【解决方案17】:

                        在 oncreate();写下这一行->

                        getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
                        

                        然后在该类中实现以下方法

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

                        【讨论】:

                          【解决方案18】:

                          Manifest.xml

                          <activity
                                      android:name=".Activity.SecondActivity"
                                      android:label="Second Activity"
                                      android:parentActivityName=".Activity.MainActivity"
                                      android:screenOrientation="portrait"></activity>
                          

                          【讨论】:

                            【解决方案19】:

                            为了在 Kotlin 中显示操作栏后退按钮 有两种实现方式

                            1.使用 Android 提供的默认操作栏 - 您的活动必须使用具有操作栏的主题 - 例如:Theme.AppCompat.Light.DarkActionBar

                            override fun onCreate(savedInstanceState: Bundle?) {
                                super.onCreate(savedInstanceState)
                                val actionBar = supportActionBar
                                actionBar!!.title = "your title"
                                actionBar.setDisplayHomeAsUpEnabled(true)
                                //actionBar.setDisplayHomeAsUpEnabled(true)
                            }
                            
                            override fun onSupportNavigateUp(): Boolean {
                                onBackPressed()
                                return true
                            }
                            

                            2。设计您自己的操作栏 - 禁用默认操作栏 - 例如:Theme.AppCompat.Light.NoActionBar - 将布局添加到您的 activity.xml

                                <androidx.appcompat.widget.Toolbar
                                 android:id="@+id/main_toolbar"
                                 android:layout_width="match_parent"
                                 app:layout_constraintEnd_toEndOf="parent"
                                 app:layout_constraintStart_toStartOf="parent"
                                 app:layout_constraintTop_toTopOf="parent">
                            
                                 <androidx.constraintlayout.widget.ConstraintLayout
                                     android:layout_width="match_parent"
                                     android:layout_height="match_parent"
                                     tools:layout_editor_absoluteX="16dp">
                            
                                     <TextView
                                         android:id="@+id/main_toolbar_title"
                                         android:layout_width="wrap_content"
                                         android:layout_height="wrap_content"
                                         android:text="Your Title"
                                         android:textSize="25sp"
                                         app:layout_constraintBottom_toBottomOf="parent"
                                         app:layout_constraintEnd_toEndOf="parent"
                                         app:layout_constraintHorizontal_bias="0.5"
                                         app:layout_constraintStart_toStartOf="parent"
                                         app:layout_constraintTop_toTopOf="parent" />
                            
                                 </androidx.constraintlayout.widget.ConstraintLayout>
                             </androidx.appcompat.widget.Toolbar>
                            
                            
                            • onCreate
                            override fun onCreate(savedInstanceState: Bundle?) {
                                 super.onCreate(savedInstanceState)
                            
                                 setSupportActionBar(findViewById(R.id.main_toolbar))
                             }
                            
                            • 创建您自己的按钮
                            <?xml version="1.0" encoding="utf-8"?>
                            <menu
                             xmlns:android="http://schemas.android.com/apk/res/android"
                             xmlns:app="http://schemas.android.com/apk/res-auto" >
                            
                             <item
                                 android:id="@+id/main_action_toolbar"
                                 android:icon="@drawable/ic_main_toolbar_item"
                                 android:title="find"
                                 android:layout_width="80dp"
                                 android:layout_height="35dp"
                                 app:actionLayout="@layout/toolbar_item"
                                 app:showAsAction="always"/>
                            
                            </menu>
                            
                            • 在 YourActivity.kt 中
                            override fun onCreateOptionsMenu(menu: Menu?): Boolean {
                                 menuInflater.inflate(R.menu.main_toolbar_item, menu)
                            
                                 leftToolbarItems = menu!!.findItem(R.id.main_action_toolbar)
                                 val actionView = leftToolbarItems.actionView
                                 val badgeTextView = actionView.findViewById<TextView>(R.id.main_action_toolbar_badge)
                                 badgeTextView.visibility = View.GONE
                            
                                 actionView.setOnClickListener {
                                     println("click on tool bar")
                                 }
                                 return super.onCreateOptionsMenu(menu)
                             }
                            

                            【讨论】:

                              【解决方案20】:

                              我的工作代码返回屏幕。

                              @Override
                              public boolean onOptionsItemSelected(MenuItem item) {
                              
                                  switch (item.getItemId()) {
                              
                                  case android.R.id.home:
                              
                                      Toast.makeText(getApplicationContext(), "Home Clicked",
                                              Toast.LENGTH_LONG).show();
                              
                                      // go to previous activity
                                      onBackPressed();
                              
                                      return true;
                              
                                  }
                              
                                  return super.onOptionsItemSelected(item);
                              }
                              

                              【讨论】:

                                【解决方案21】:
                                 public void initToolbar(){
                                       //this set back button 
                                       getSupportActionBar().setDisplayHomeAsUpEnabled(true);
                                       //this is set custom image to back button
                                       getSupportActionBar().setHomeAsUpIndicator(R.drawable.back_btn_image);
                                }
                                
                                
                                //this method call when you press back button
                                @Override
                                public boolean onSupportNavigateUp(){
                                    finish();
                                    return true;
                                }
                                

                                【讨论】:

                                  【解决方案22】:
                                  ActionBar actionBar=getActionBar();
                                  
                                  actionBar.setDisplayHomeAsUpEnabled(true);
                                  
                                  @Override
                                  public boolean onOptionsItemSelected(MenuItem item) { 
                                          switch (item.getItemId()) {
                                          case android.R.id.home: 
                                              onBackPressed();
                                              return true;
                                          }
                                  
                                      return super.onOptionsItemSelected(item);
                                  }
                                  

                                  【讨论】:

                                    【解决方案23】:

                                    现在回答可能为时已晚,但我认为我有一个更短、更实用的解决方案。

                                    // Inside your onCreate method, add these.
                                    ActionBar actionBar = getSupportActionBar();
                                    actionBar.setHomeButtonEnabled(true);
                                    actionBar.setDisplayHomeAsUpEnabled(true);
                                    
                                    // After the method's closing bracket, add the following method exactly as it is and voiulla, a fully functional back arrow appears at the action bar
                                    @Override
                                    public boolean onOptionsItemSelected(MenuItem item) {
                                        onBackPressed();
                                        return true;
                                    }
                                    

                                    【讨论】:

                                      【解决方案24】:

                                      在 onCreate 函数中添加以下代码:

                                      getSupportActionBar().setDisplayHomeAsUpEnabled(true);

                                      然后覆盖: @覆盖 public boolean onOptionsItemSelected(MenuItem item){ onBackPressed(); 返回真; }

                                      【讨论】:

                                        【解决方案25】:

                                        在更新版本中 getActionBar() 不起作用!

                                        相反,您可以这样做

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

                                        add back button in android title bar 这将在 2020 年帮助您

                                        【讨论】:

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