Android - 标题栏中的后退按钮

Dre*_*rew 94 user-interface android themes titlebar

在许多应用程序(日历,驱动器,Play商店)中,当您点击按钮并输入新活动时,标题栏中的图标将变为后退按钮,但对于我正在制作的应用程序,它不会这样做.如何使该图标带您回到上一个屏幕?

小智 128

在标题栏中创建后退按钮有两个简单的步骤:

首先,使用要在其标题栏中包含后退按钮的活动中的以下代码,使应用程序图标可单击:

ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
Run Code Online (Sandbox Code Playgroud)

添加上述代码后,您将看到应用程序图标左侧出现一个后退箭头.

在此输入图像描述

其次,完成上述操作后,您仍然需要创建将利用click事件的代码.为此,请注意,当您实际单击应用程序图标时,将onOptionsItemSelected调用一个方法.因此,要返回上一个活动,请将该方法添加到您的活动中,并将Intent代码放入其中,以使您返回上一个活动.例如,假设您正在尝试返回的活动被调用MyActivity.要返回它,请按如下方式编写方法:

public boolean onOptionsItemSelected(MenuItem item){
    Intent myIntent = new Intent(getApplicationContext(), MyActivity.class);
    startActivityForResult(myIntent, 0);
    return true;
}
Run Code Online (Sandbox Code Playgroud)

而已!

(在Android开发人员API中,它建议搞乱清单并添加类似的东西android:parentActivityName.但这对我来说似乎不起作用.以上更简单,更可靠.)

<meta-data
      android:name="android.support.PARENT_ACTIVITY"
      android:value=".MainActivity" />
Run Code Online (Sandbox Code Playgroud)

在你的活动中

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Run Code Online (Sandbox Code Playgroud)

  • 你解释得很好但是如果onOptionItemSelected没有错,你应该调用finish(); 在你的情况下,startActivityForResult将启动第二个活动,当你从第二个活动按回来时,你将被扔回第一个活动(你按下操作栏图标) (22认同)
  • 此外,只有当item.getItemId()是android.R.id.home时才应该这样做 (7认同)
  • 如AS所述:“方法调用'actionBar.setDisplayHomeAsUpEnabled(true)'可能会产生java.lang.NullPointerException” (2认同)
  • getActionBar()对我不起作用,应用程序崩溃了。getSupportActionBar()确实起作用。 (2认同)

小智 55

使用此代码

 @Override
 public void onCreate(Bundle savedInstanceState) {
    ...
   getActionBar().setDisplayHomeAsUpEnabled(true);
 } 
Run Code Online (Sandbox Code Playgroud)

之后在onOptionsItemSelected方法中编写此代码

  int id = item.getItemId();

     if (id==android.R.id.home) {
        finish();
    }
Run Code Online (Sandbox Code Playgroud)

  • 因为没有ActionBar,例如样式<item name ="android:windowActionBar"> false </ item> <item name ="android:windowNoTitle"> true </ item> (3认同)

Luc*_*air 37

我终于设法正确添加按钮到操作栏/工具栏

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

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

    return super.onOptionsItemSelected(item);
}

public boolean onCreateOptionsMenu(Menu menu) {
    return true;
}
Run Code Online (Sandbox Code Playgroud)

  • 这是唯一对我有用的答案。谢谢@LucyFair (2认同)
  • 相同的。谢谢您的回答。 (2认同)

spa*_*ker 16

1.-将活动添加到AndroidManifest.xml并确保提供元数据:

<activity
    android:name="com.example.myfirstapp.DisplayMessageActivity"
    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>
Run Code Online (Sandbox Code Playgroud)

2.-将以下代码添加到活动的onCreate方法中:

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    getActionBar().setDisplayHomeAsUpEnabled(true);
} 
Run Code Online (Sandbox Code Playgroud)

3.-重写onOptionsItemSelected并使用NavUtils.navigateUpFromSameTask()静态方法导航抛出堆栈.

@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);
}
Run Code Online (Sandbox Code Playgroud)

但是,使用navigateUpFromSameTask()仅适用于您的应用是当前任务的所有者(即,用户从您的应用开始执行此任务).如果这不是真的并且您的活动是在属于不同应用程序的任务中启动的,那么导航Up应该创建属于您的应用程序的新任务,这需要您创建新的后备堆栈.


tot*_*tot 9

如果您的活动确实扩展了活动

public class YourActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_xxx);

        getActionBar().setHomeButtonEnabled(true);

        [...]
    }

    [...]
}
Run Code Online (Sandbox Code Playgroud)

如果您的操作扩展了AppCompatActivity

public class YourActivity extends AppCompatActivity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_xxx);

            getSupportActionBar().setHomeButtonEnabled(true);

            [...]
        }

        [...]
    }
Run Code Online (Sandbox Code Playgroud)

没什么可做的,请参阅添加操作

[可选]要明确定义父活动,请修改您的Manifest.xml,如下所示:

<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.YourActivity "
        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>
Run Code Online (Sandbox Code Playgroud)

请参阅指定父活动

  • 这正是我一直在寻找的。你救了我的命。多谢。 (2认同)

小智 7

首先你需要编写这些代码

@Override
    protected void onCreate(Bundle savedInstanceState) {
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }
Run Code Online (Sandbox Code Playgroud)

然后在清单中添加这一行

 <activity android:name=".MainActivity"
            android:parentActivityName=".PreviousActivity"></activity>
Run Code Online (Sandbox Code Playgroud)

我认为它会起作用


Ruz*_*zin 6

如果您的活动扩展,AppCompatActivity您需要onSupportNavigateUp()像这样覆盖方法:

public class SecondActivity extends AppCompatActivity {

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_second);
       Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
       setSupportActionBar(toolbar);
       getSupportActionBar().setHomeButtonEnabled(true);
       getSupportActionBar().setDisplayHomeAsUpEnabled(true);
       ...
   }

   @Override
   public void onBackPressed() {
       super.onBackPressed();
       this.finish();
   }

   @Override
   public boolean onSupportNavigateUp() {
       onBackPressed();
       return true;
   }
}
Run Code Online (Sandbox Code Playgroud)

在您的onBackPressed()方法中处理您的逻辑并调用该方法,onSupportNavigateUp()以便手机上的后退按钮和工具栏上的箭头执行相同的操作。


Mim*_*han 6

经过一段时间我发现,主题选项是我代码中的主要问题,以下是为我显示工具栏的正确方法

首先在 AndroidManifest 文件中,您必须更改主题样式

Theme.AppCompat.Light.DarkActionBar
to 
Theme.AppCompat.Light.NoActionBar
Run Code Online (Sandbox Code Playgroud)

然后在您的活动 xml 中,您需要调用自己的工具栏,例如

<androidx.appcompat.widget.Toolbar
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="@color/colorPrimary"
        android:id="@+id/toolbar"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        android:elevation="4dp"/>
Run Code Online (Sandbox Code Playgroud)

然后这个工具栏应该在你的 Java 文件中被调用

Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
Run Code Online (Sandbox Code Playgroud)

对于显示 U 的工具栏,应检查 null 以避免 NullPointerException

if(getSupportActionBar() != null){
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
Run Code Online (Sandbox Code Playgroud)

对于家庭活动回来添加这个

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

        return super.onOptionsItemSelected(item);
    }
Run Code Online (Sandbox Code Playgroud)

或为您想要的活动回来

public boolean onOptionsItemSelected(MenuItem item){
    Intent myIntent = new Intent(getApplicationContext(), YourActivity.class);
    startActivityForResult(myIntent, 0);
    return true;
}
Run Code Online (Sandbox Code Playgroud)


S.A*_*ram 6

  protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.YourxmlFileName);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

  public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        if (id==android.R.id.home) {
            finish();
            return true;
        }
        return false;
    }
Run Code Online (Sandbox Code Playgroud)


ral*_*abb 5

如果您在 android studio 中使用新的 5.1 支持库,您可以在 AppCompatActivity 上使用它

 ActionBar actionBar = getSupportActionBar();
 actionBar.setHomeButtonEnabled(true);
 actionBar.setDisplayHomeAsUpEnabled(true);
 actionBar.setHomeAsUpIndicator(R.mipmap.ic_arrow_back_white_24dp);
 actionBar.setDisplayShowHomeEnabled(true);
Run Code Online (Sandbox Code Playgroud)

干杯。


luk*_*gts 5

谷歌解释的最简单的方法和最佳实践在这里解释:

1.为您的childActivity添加父级AndroidManifest.xml:

<activity 
        android:name=".ChildActivity"
        android:parentActivityName=".ParentActivity" >
</activity>
Run Code Online (Sandbox Code Playgroud)

2.激活childActivity中的后退按钮:

myActionOrActionSupportBar.setDisplayHomeAsUpEnabled(true);
Run Code Online (Sandbox Code Playgroud)

为我工作,我希望它也适合你.


小智 5

首先在onCreate函数中添加以下行

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Run Code Online (Sandbox Code Playgroud)

然后在代码中添加以下函数:

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

        return super.onOptionsItemSelected(item);
    }
Run Code Online (Sandbox Code Playgroud)


Zha*_*har 5

我看到了很多复杂的答案,所以这是我的代码。在这里工作。您可以通过两种方式实现这一目标。

1) 标准安卓兼容性

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.NavUtils;

import android.view.MenuItem;
import android.view.View;

public class EditDiscoveryActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_edit_discovery);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        /*toolbar.setNavigationIcon(R.drawable.ic_arrow_white_24dp);
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }
        });*/
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    }

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

}
Run Code Online (Sandbox Code Playgroud)

2)使用自定义图标

如果您想在注释中使用代码,您只需在可绘制文件中添加此文件,名为 ic_arrow_white_24dp.xml

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24.0"
    android:viewportHeight="24.0">
    <path
        android:fillColor="#ffffff"
        android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z"/>
    </vector>
Run Code Online (Sandbox Code Playgroud)

有了这个代码。

toolbar.setNavigationIcon(R.drawable.ic_arrow_white_24dp);
            toolbar.setNavigationOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    finish();
                }
            });
Run Code Online (Sandbox Code Playgroud)

希望它能帮助这里的一些人!