将返回按钮添加到操作栏
Posted
技术标签:
【中文标题】将返回按钮添加到操作栏【英文标题】: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
【参考方案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;
【讨论】:
以上是关于将返回按钮添加到操作栏的主要内容,如果未能解决你的问题,请参考以下文章