您的位置:首页 > 移动开发 > Android开发

Android home/up 按钮

2016-07-25 23:39 288 查看
可能看了标题也不知道我说的是什么?

是!这个!



这个按钮 官方称为 up navigation

指明父activity

向上回溯的操作首先你得有一个“上”,这个上,就是指明的 父activity。也就是不管你是从什么地方打开的,你得 回溯动作一定是返回到你的父activity

如何指明呢?

<activity android:name=".ChildActivity"
...
android:parentActivityName=".ParentActivity"
>
<!--如果要支持android4.0以下的-->
<meta-data
android:name = "android.support.PARENT_ACTIVITY"
android:value = ".ParenetActivty"
/>
</activity>


添加upAction

使用 setDisplayHomeEnabled() 方法,给actionbar添加一个up按钮:

注意:目前androidStudio自动生成的Activity 是 继承 AppCompatActivit 的

而 APPCompatActivity 是 android.support.v7.app 里的

所以:

@Override
public void onCreate(Bundle savedInstanceState) {
...
getActionBar().setDisplayHomeAsUpEnabled(true); // 这个是一般支持的,使用会报错
getSupportActionBar.setDisplayHomeAsEnabled(true); // 这个是v7支持的,在目前可以使用
}


使用这个方法添加的up键,要在哪里监听呢?

答案是:onOptionsItemSelected()

代码如下:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// 对于up按钮的响应如下
case android.R.id.home:
NavUtils.navigateUpFromSameTask(this);
return true;
}
return super.onOptionsItemSelected(item);
}


可以看到,这里使用了 NavUtils 类的一个 静态方法 navigateUpFromSameTask

这个静态方法的作用就是 调用时,结束当前的Activity,并且开始对应的父Activity

注意,对应两种不同的 parent Activity 的 launch mode ,也有两种不同的打开方式:

模式为 singTop 或者 是 intent 包含 FLAG_ACTIVITY_CLEAR_TOP , 那么parent activity 就会提到stack前面,并且 从 onNewIntent() 方法中可以获取 inten

模式为 standard 或者 是 intent 没有包含上面的flag的,parent Activity会先从栈中pop掉,然后在栈顶用一个新的实例来获取intent

特别要注意的是:如果要使用 navigateUpFromSameTask 如这个方法的名字,首先一定要是同一个task,也就是说,目前的这个task一定要是从你的app中打开的。如果是从其他的app中打开这个Activity,那么Up应该创建一个新的,属于你的app的task, 也就是要求新建一个 new back stack

回退到新的 回退栈 navigate up with a new back stack

解决在不同app打开Activity问题

如果你的这个Activity,是允许别的应用打开的。那么应该实现 onOptionsItemSelected() 方法,使得当点击navigate up的时候,你的app可以创建一个新的 task (对应一个back stack)

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// Respond to the action bar's Up/Home button
case android.R.id.home:
Intent upIntent = NavUtils.getParentActivityIntent(this); // 获取当前Activity的parent Activity
if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
// 判断parentActivity在不在当前的task中,如果不在,那么说明是从别的app打开的当前app
// 所以就用 TaskStackBuilder 来创建一个新的task
TaskStackBuilder.create(this)
// 添加这个Activity所有的parent到这个task中
.addNextIntentWithParentStack(upIntent)
// 跳转到最近的parent
.startActivities();
} else {
// 如果在,说明是同一个app打开的,那么跳转到它的逻辑父Activity就好了
NavUtils.navigateUpTo(this, upIntent);
}
return true;
}
return super.onOptionsItemSelected(item);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android