【问题标题】:Android - Back button in the title barAndroid - 标题栏中的后退按钮
【发布时间】:2013-01-10 19:03:37
【问题描述】:

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

【问题讨论】:

标签: android user-interface themes titlebar


【解决方案1】:

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

首先,在您希望在其标题栏中添加后退按钮的 Activity 中使用以下代码使应用程序图标可点击:

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

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

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

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

就是这样!

(在 Android 开发者 API 中,它建议弄乱清单并添加诸如 android:parentActivityName 之类的东西。但这似乎对我不起作用。上面更简单、更可靠。)

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

在你的活动中

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

【讨论】:

  • 你解释得很好,但如果你的 onOptionItemSelected 没有错,你应该调用 finish();在您的情况下 startActivityForResult 将启动第二个活动,当您从第二个活动按回时,您将被扔回第一个活动(您按下操作栏图标的位置)
  • 此外,只有在 item.getItemId() 是 android.R.id.home 时才应该这样做
  • AS 声明:“方法调用 'actionBar.setDisplayHomeAsUpEnabled(true)' 可能产生 java.lang.NullPointerException”
  • 警告!使用 ToolBar actionBar 返回 null 并崩溃。请参阅下面的答案。
  • getActionBar() 对我不起作用,应用程序崩溃了。 getSupportActionBar() 确实有效。
【解决方案2】:

使用此代码

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

然后在onOptionsItemSelected方法中编写这段代码

  int id = item.getItemId();

     if (id==android.R.id.home) {
        finish();
    }

【讨论】:

  • getActionBar() 给我一个空值;你知道为什么吗?
  • 因为没有ActionBar,例如带有样式 falsetrue
【解决方案3】:

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

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

【讨论】:

  • 这是唯一适合我的答案。谢谢@LucyFair
  • 相同。谢谢你的回答。
  • 相同。其他答案都不起作用。这应该是公认的答案。
【解决方案4】:

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>

2.- 在activity的onCreate方法中添加如下代码:

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

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

但是,使用 navigateUpFromSameTask() 仅适用于您的应用 是当前任务的所有者(即用户开始了这个任务 从您的应用程序)。如果这不是真的,并且您的活动是在 属于不同应用程序的任务,然后向上导航应该创建 属于您的应用程序的新任务,这需要您创建一个 新的回栈。

【讨论】:

  • 感谢您介绍 NavUtils!
【解决方案5】:

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

public class YourActivity extends Activity {

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

        getActionBar().setHomeButtonEnabled(true);

        [...]
    }

    [...]
}

如果您的操作扩展了 AppCompatActivity

public class YourActivity extends AppCompatActivity {

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

            getSupportActionBar().setHomeButtonEnabled(true);

            [...]
        }

        [...]
    }

无事可做,见Add up action

[可选] 要显式定义父活动,请修改您的 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>

Specify the Parent Activity

【讨论】:

  • 这正是我想要的。你拯救了我的一天。非常感谢。
【解决方案6】:

首先你需要编写这段代码

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

然后在清单中添加这一行

 <activity android:name=".MainActivity"
            android:parentActivityName=".PreviousActivity"></activity>

我认为它会起作用

【讨论】:

    【解决方案7】:

    首先在 onCreate 函数中添加下面一行

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    

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

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

    【讨论】:

      【解决方案8】:

      如果您的活动扩展 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;
         }
      }
      

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

      【讨论】:

        【解决方案9】:

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

        首先在 AndroidManifest 文件中你必须改变你的主题风格

        Theme.AppCompat.Light.DarkActionBar
        to 
        Theme.AppCompat.Light.NoActionBar
        

        然后在您的活动 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"/>
        

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

        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        

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

        if(getSupportActionBar() != null){
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        }
        

        对于主页活动返回添加此

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

        或返回您想要的活动

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

        【讨论】:

          【解决方案10】:

          如果您在 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);
          

          干杯。

          【讨论】:

            【解决方案11】:

            谷歌解释的最简单的方法和最佳实践in here

            1.在AndroidManifest.xml中为你的childActivity添加一个父级:

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

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

            myActionOrActionSupportBar.setDisplayHomeAsUpEnabled(true);
            

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

            【讨论】:

            • 这仅在活动只能有一个父活动时才有效。我就是这种情况。 +1
            • 我的情况不需要第 2 步。
            【解决方案12】:

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

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

            2) 使用自定义图标

            如果你想在 cmets 中使用代码,你只需在 drawable 中添加这个文件,名为 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>
            

            使用此代码。

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

            希望对这里的一些人有所帮助!

            【讨论】:

              【解决方案13】:
                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;
                  }
              

              【讨论】:

              • 这正是我要找的,其他答案假设我想回到活动 X 但我实际上想回到上一个活动。
              【解决方案14】:

              2020 年你需要做的所有事情:
              (考虑到你想返回 MainActivity)

              protected void onCreate(Bundle savedInstanceState){
                  ...
                  getSupportActionBar().setDisplayHomeAsUpEnabled(true);
              }
              
              public boolean onOptionsItemSelected(MenuItem item) {
                  Intent myIntent = new Intent(getApplicationContext(), MainActivity.class);
                  startActivityForResult(myIntent, 0);
                  return true;
              }
              

              【讨论】:

              • 这很有趣,但您假设我们想回到 MainActivity。您将如何重定向到任何以前的活动?
              【解决方案15】:

              不使用ActionBarActivity 的轻量级版本仍然具有相同的行为:

              public class ToolbarConfigurer implements View.OnClickListener {
                  private Activity activity;
              
                  public ToolbarConfigurer(Activity activity, Toolbar toolbar, boolean displayHomeAsUpEnabled) {
                      toolbar.setTitle((this.activity = activity).getTitle());
                      if (!displayHomeAsUpEnabled) return;
                      toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
                      toolbar.setNavigationOnClickListener(this);
                  }
              
                  @Override
                  public void onClick(View v) {
                      NavUtils.navigateUpFromSameTask(activity);
                  }
              }
              

              用法:将new ToolbarConfigurer(this, (Toolbar) findViewById(R.id.my_awesome_toolbar), true); 放入onCreate

              【讨论】:

              • 这适合包含在支持库中的新工具栏小部件。谢谢!!
              【解决方案16】:

              您需要在清单文件中添加下面提到的代码。 搜索要在其中添加后退箭头功能的活动。 如果你找到了那很好或创建活动

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

              然后在其间添加以下三行代码。

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

              别忘了在onCreate()中添加这段代码;您需要返回箭头的特定活动的方法。

                      Toolbar toolbar = (Toolbar) findViewById(R.id.searchToolbar);
                  setSupportActionBar(toolbar);
                  try{
                      getSupportActionBar().setDisplayHomeAsUpEnabled(true);
                  }catch(NullPointerException e){
                     Log.e("SearchActivity Toolbar", "You have got a NULL POINTER EXCEPTION");
                  }
              

              这就是我解决问题的方法。 谢谢。

              【讨论】:

                【解决方案17】:

                对于科特林:

                   override fun onOptionsItemSelected(item: MenuItem): Boolean {
                        onBackPressed();
                        return true;
                    }
                

                【讨论】:

                  【解决方案18】:

                  我需要混合一些答案来为我找到正确的答案,因为我的应用程序有 3 个可以随时来回的活动。活动 1 > 活动 2 > 活动 3。当我在我的活动 3 上做某事时,后退按钮正确返回到活动 2。但是,从 Activity2 开始,使用 finish(),它返回到 Activity3 而不是 Activity1。我正在扩展 AppCompatActivity。所以,我的解决方案是:

                  public class Activity2 extends AppCompatActivity {
                          @Override
                          protected void onCreate(Bundle savedInstanceState) {
                              ...
                  
                              getSupportActionBar().setHomeButtonEnabled(true);
                          }
                      }
                  

                  在 AndroidManifest.xml 上:

                  <activity android:name=".activities.Activity2"
                             android:parentActivityName="com.example.appname.activities.Activity1">
                              <meta-data
                                  android:name="android.support.PARENT_ACTIVITY"
                                  android:value="com.example.appname.activities.Activity1" />
                          </activity>
                  

                  最后,我的菜单上的操作按钮(操作栏):

                  public boolean onOptionsItemSelected(MenuItem item) {
                          switch (item.getItemId()){
                              ...
                  
                              case android.R.id.home:
                                  NavUtils.navigateUpFromSameTask(this);
                                  return true;
                  
                          }
                  
                          return super.onOptionsItemSelected(item);
                  
                      }
                  

                  使用NavUtils.navigateUpFromSameTask(this); 对我有用,而不是finish()

                  【讨论】:

                    【解决方案19】:

                    其他答案没有提到您也可以在Toolbar 小部件的 XML 中进行设置:

                    app:navigationIcon="?attr/homeAsUpIndicator"

                    例如:

                    <android.support.v7.widget.Toolbar
                        android:id="@+id/toolbar"
                        android:layout_width="match_parent"
                        android:layout_height="?attr/actionBarSize"
                        android:background="?attr/colorPrimary"
                        app:navigationIcon="?attr/homeAsUpIndicator"
                        app:popupTheme="@style/AppTheme.PopupOverlay"
                        app:title="@string/title_activity_acoustic_progress" />
                    

                    【讨论】:

                      【解决方案20】:

                      只是分享一些对我有帮助并且可能对其他人有用的东西。尽管这里的大多数答案都是正确的,但通过使用getActionBar().setDisplayHomeAsUpEnabled(true);,这对我不起作用。我遇到的问题是我试图手动创建第二个活动,但涉及更多细节。
                      真正解决我的问题的是遵循 Android 开发者教程 (https://developer.android.com/training/basics/firstapp/starting-activity) 使用 Android Studio 自己的工具创建第二个 Activity:

                      Create the second activity
                      1. In the Project window, right-click the app folder and select New > Activity > Empty Activity.
                      2. In the Configure Activity window, enter "DisplayMessageActivity" for Activity Name and click Finish (leave all other properties set to the defaults).
                      Android Studio automatically does three things:
                      - Creates the DisplayMessageActivity file.
                      - Creates the corresponding activity_display_message.xml layout file.
                      - Adds the required <activity> element in AndroidManifest.xml.
                      

                      【讨论】:

                        【解决方案21】:

                        如果您使用的是 ActionBar,您需要阅读本文档 http://developer.android.com/reference/android/app/ActionBar.html#setDisplayHomeAsUpEnabled(boolean)

                        然后你必须覆盖方法 onOptionsItemSelected(MenuItem) 并寻找 android.R.id.home 事件进来。然后你知道用户点击了操作栏上的返回按钮

                        【讨论】:

                          【解决方案22】:

                          也可以通过在应用清单中指定父活动来完成,无需代码 如果您想要 Activity B 中的后退按钮将转到 Activity A,只需在清单中添加 Activity A 作为 Activity B 的父级。

                          【讨论】:

                            【解决方案23】:

                            您也可以简单地将onBackPressed() 放入您的 onClick 侦听器中。这会使您的按钮像 Android 应用程序中的默认“后退/向上”按钮一样!

                            【讨论】:

                              【解决方案24】:
                              Toolbar toolbar=findViewById(R.id.toolbar);
                              getSupportActionBar().setDisplayHomeAsUpEnabled(true);
                              
                              if (getSupportActionBar()==null){
                                  getSupportActionBar().setDisplayHomeAsUpEnabled(true);
                                  getSupportActionBar().setDisplayShowHomeEnabled(true);
                              }
                              
                              @Override
                              public boolean onOptionsItemSelected(MenuItem item) {
                              if(item.getItemId()==android.R.id.home)
                                  finish();
                              return super.onOptionsItemSelected(item);
                              }
                              

                              【讨论】:

                                【解决方案25】:

                                这对我有用..假设有两个活动(Activityone,Activitytwo)

                                在 Activitytwo 中使用这段代码

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

                                在 Activityone 上

                                //when you need to go second activity
                                startActivity(new Intent(Activityone.this, Activitytwo.class));
                                

                                这应该包含在清单文件中的第二个活动中

                                <activity android:name=".Activitytwo"
                                        android:parentActivityName=".Activityone"></activity>
                                

                                结果会是这样的

                                【讨论】:

                                  【解决方案26】:

                                  这对我有用 getSupportActionBar().setDisplayHomeAsUpEnabled(false); enter image description here

                                  【讨论】:

                                    猜你喜欢
                                    • 1970-01-01
                                    • 2014-04-30
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 2020-01-07
                                    • 1970-01-01
                                    相关资源
                                    最近更新 更多