如何实现Android ActionBar后退button?

我有一个列表视图的活动。 当用户点击该项目时,打开“查看器”项目:

List1.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) { Intent nextScreen = new Intent(context,ServicesViewActivity.class); String[] Service = (String[])List1.getItemAtPosition(arg2); //Sending data to another Activity nextScreen.putExtra("data", datainfo); startActivityForResult(nextScreen,0); overridePendingTransition(R.anim.right_enter, R.anim.left_exit); } }); 

这工作正常,但在操作栏上应用程序图标旁边的后退箭头不会被激活。 我错过了什么吗?

Selvin已经发布了正确的答案,这里只是漂亮代码中的解决scheme;-)

 public class ServicesViewActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // etc... getActionBar().setDisplayHomeAsUpEnabled(true); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: NavUtils.navigateUpFromSameTask(this); return true; default: return super.onOptionsItemSelected(item); } } } 

NavUtils.navigateUpFromSameTask(this)函数需要你在AndroidManifest.xml文件中定义父活动

  <activity android:name="com.example.ServicesViewActivity" > <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.ParentActivity" /> </activity> 

http://developer.android.com/design/patterns/navigation.html#up-vs-back

确保您的ActionBar主页button已在活动中启用:

Android,API 5+:

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

ActionBarSherlock和App-Compat,API 7+:

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

Android,API 11+:

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

扩展ActionBarActivity MainActivity示例:

 public class MainActivity extends ActionBarActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Back button getSupportActionBar().setDisplayHomeAsUpEnabled(true); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: // API 5+ solution onBackPressed(); return true; default: return super.onOptionsItemSelected(item); } } } 

这样所有你想要的活动都可以得到支持。

Android,API 16+:

http://developer.android.com/training/implementing-navigation/ancestral.html

AndroidManifest.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.DisplayMessageActivity" android:label="@string/title_activity_display_message" android:parentActivityName="com.example.myfirstapp.MainActivity" > <!-- The meta-data element is needed for versions lower than 4.1 --> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.myfirstapp.MainActivity" /> </activity> </application> 

扩展ActionBarActivity MainActivity示例:

 public class MainActivity extends ActionBarActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Back button getSupportActionBar().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); } } 

要启用ActionBar后退button,您显然需要在您的Activity中有一个ActionBar。 这是由您正在使用的主题设置。 您可以在AndroidManfiest.xml为您的Activity设置主题。 如果你正在使用例如@android:style/Theme.NoTitleBar主题,你没有一个ActionBar。 在这种情况下,对getActionBar()的调用将返回null。 所以确保你有一个ActionBar第一。

下一步是将android:parentActivityName设置为您想要导航的活动,如果按下后退button。 这也应该在AndroidManfiest.xml完成。

现在,您可以在“孩子”活动的onCreate方法中启用后退button。

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

现在你应该实现后退button的逻辑。 你只需重写你的“子”活动中的onOptionsItemSelected方法,并检查后退button的id是android.R.id.home

现在你可以触发方法NavUtils.navigateUpFromSameTask(this); 但是如果你没有在你的AndroidManfiest.xml指定android:parentActivityName这将会使你的应用程序崩溃。

有时这是你想要的,因为它提醒你,你忘记了“某些东西”,但是如果你想阻止这个,你可以使用getParentActivityIntent()方法检查你的活动是否有一个父类。 如果这返回null,你没有指定父。

在这种情况下,您可以触发onBackPressed()方法,该方法基本上与用户按下设备上的后退button相同。 一个好的实现,永远不会崩溃你的应用程序将是

 @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: if (getParentActivityIntent() == null) { Log.i(TAG, "You have forgotten to specify the parentActivityName in the AndroidManifest!"); onBackPressed(); } else { NavUtils.navigateUpFromSameTask(this); } return true; default: return super.onOptionsItemSelected(item); } } 

请注意,用户看到的animation是不同NavUtils.navigateUpFromSameTask(this);onBackPressed()

这取决于你的道路,但我发现解决scheme很有帮助,特别是如果你使用基类来进行所有的活动。

Android注释:

 @OptionsItem(android.R.id.home) void homeSelected() { onBackPressed(); } 

来源: https : //github.com/excilys/androidannotations

AndroidManifest文件:

  <activity android:name=".activity.DetailsActivity"> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="br.com.halyson.materialdesign.activity.HomeActivity" /> </activity> 

添加DetailsActivity:

 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); } 

是工作 :]

我认为onSupportNavigateUp()是最简单也是最好的方法

检查此链接中的代码点击此处查看完整的代码

https://stackoverflow.com/a/46903870/4489222

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

第1步:转到AndroidManifest.xml并在标签中添加参数 – android:parentActivityName =“。home.HomeActivity”

例如:

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

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

例如:

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