如何实现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);} }