在操作栏上显示后退按钮


180

我正在尝试在上显示Back buttonAction bar以将上一个页面/活动或主要页面移至第一个页面。而且我做不到。

我的代码。

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

代码在中onCreate


19
使用:getSupportActionBar()。setDisplayHomeAsUpEnabled(true);
Sukitha Udugamasooriya 2015年

@SukithaUdugamasooriya非常感谢
Sardorbek Rkh

Answers:


206

好吧,这是一个简单的显示后退按钮的按钮

actionBar.setDisplayHomeAsUpEnabled(true);

然后您可以在onOptionsItemSelected上自定义back事件

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

我在onOptionsItemSelected(MenuItem item)上添加了以上几行,因为我已经在操作菜单中列出了要重定向菜单选项的ID,所以在操作上已经有一个菜单,因此单击时home ID不起作用

如果您遇到奇怪的行为(例如:您使用片段的后退按钮(R.id.home)并最终关闭了该活动),请确保没有为此活动设置“ android:noHistory”,因为如果您可以做到,甚至从片段回到活动的“概述”也可以完成。
伊戈尔(Igor)

2
确保您在AndroidMenifest.xml中设置了父活动,以使R.id.home按钮正常工作。
飞鹰队

192

我认为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添加到清单文件中的活动中,如下所示:

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

编辑:如果您不使用AppCompat活动,则不使用support单词,可以使用

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

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

感谢@atariguy发表评论。


2
当您需要将数据发送回父活动或想要在父活动中保留EditText的值时,此解决方案非常有用。我尝试了onOptionsItemSelected解决方案,但没有这样做。
weeix

3
最佳解决方案+10。
Satheeshwaran

3
如果您不使用操作栏的支持库,请进行以下修改: getActionBar().setDisplayHomeAsUpEnabled(true); @Override public boolean onNavigateUp(){ finish(); return true; }
atariguy

1
现象。+1。简单。优雅。美丽。:)
罗希特·库玛

1
谢谢你的帮助。通过使用清单,它不起作用,但是在使用代码,它起作用了
santosh devnath 18/09/18

70

魔术发生在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);
    }
}

1
就我而言,我想在该页面中添加后退按钮,其中onOptionsItemSelected(MenuItem item)事件将不存在...是否有其他解决方案?
Vidhi

1
您应该getActionBar().setDisplayHomeAsUpEnabled(true);先为显示后退按钮添加onCreateMethod
aletede91 2015年

1
我认为,如果您采用这种方式,即使您再次开始上一个活动,现在也不会再回头,而现在又增加了一个实例,并且只要持续足够长的时间,您就会一直前进直到堆栈溢出。我认为Igor的答案是正确的,您应该使用finish()停止此活动,并让框架让您回到之前的活动实例运行状态。
Reijo Korhonen

2
this.onBackPressed();用户单击后退按钮时的使用方法。
CaptRisky '16

47

官方解决方案

将这两个代码段添加到您的SubActivity

@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来支持较低的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


5
注意:如果使用支持库向后兼容,则需要使用“ getSupportActionBar()”而不是“ getActionBar()”。这是最完整,最正式的答案。
Christopher Bull

32

将这些行添加到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);
        }
    }

希望这个能对您有所帮助..!


27

尝试使用此代码,仅在需要后退按钮时才考虑使用。

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

17

在您的onCreate方法上添加:

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

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

<activity>清单的定义中,添加以下行:

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

如果您希望支持4.0之前的设备,则只需输入Manifest代码。但是,对于当前库而言,第一部分代码是一个更好的解决方案。
Louie Bertoncin

8

我知道我来晚了,但是能够通过直接关注文档来解决此问题。

将元数据标签添加到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开发人员文档


6

我知道上面有很多有用的解决方案,但是这次我读了这篇文章(当前的Android Studio 2.1.2带有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>

其次,确保您的子活动是Extension AppCompatActivity而不是FragmentActivity。

三,覆盖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);
        }
    }

希望这会有所帮助!


4

在您的onCreate()中尝试一下

 getActionBar().setHomeButtonEnabled(true);
 getActionBar().setDisplayHomeAsUpEnabled(true);

对于clickevent,

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

4

为此,只需执行两个步骤,

第1步:转到AndroidManifest.xml并将此参数添加到<activity>代码中-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);
}

4

在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

这就是我们要做的。


4

这很简单,非常适合我

将此添加到onCreate()方法中

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

将此添加到oncreate()方法之外

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

3

在您的onCreate()方法中添加此行

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

并在同一活动中添加此方法来处理按钮单击

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

2

我以这种方式解决了

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

1

我的工作代码返回屏幕。

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

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

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

1

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

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

1

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


1

为了在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)
 }

0

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

getSupportActionBar()。setDisplayHomeAsUpEnabled(true);

然后重写:@Override public boolean onOptionsItemSelected(MenuItem item){onBackPressed(); 返回true;}


0

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

相反,您可以通过这种方式进行

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

在android标题栏中添加返回按钮,这将在2020年为您提供帮助


您最后的两个答案都链接到同一站点。您是否以任何方式与该网站关联/关联?如果您是会员,则必须在该帖子中披露该从属关系。如果您不透露从属关系,则将其视为垃圾邮件。请参阅:什么表示“良好”的自我提升?自我推销一些提示和建议什么是“垃圾邮件”的堆栈溢出的确切定义是什么?以及导致垃圾内容的原因
Makyen
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.