上一节中讲了 up 按钮, up按钮是在UI中实现的。上一节中有时候还误称为 back。
但是,真正的back按钮,其实是不需要再android UI中实现的,因为所有的android设备都有,(左下或者右下)
一般来说,back按钮就是维护一个简单的回退栈,但是在某一些情况下,需要指明back按钮的行为,以达到最好的用户体验
非常典型
上一节中有讲到在< activity > 中添加 parentActivityName 属性来确定一个Activity的父Activity。
这样,我们就可以用 NavUtils 导航工具类来合成一个新的task
下面代码是一个通知的例子,本来是可以用 startActivity()来打开 Activity的,但是现在使用TaskStackBuilder 的api来定义所有需要放进新的task中的Activity,然后通过 startActivites()或者创建一个对应的 PendingIntent 来,打开对应的Activity
// 当用户点击通知的时候,要打开的Activity
Intent detailsIntent = new Intent(this, DetailsActivity.class);
// 通过TaskStackBuilder来创建一个back stack 并且 获取一个 pendingInent
PendingIntent pendingIntent =
TaskStackBuilder.create(this)
// add all of DetailsActivity's parents to the stack,
// followed by DetailsActivity itself
.addNextIntentWithParentStack(upIntent)
.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setContentIntent(pendingIntent); // 将满含之前的parentActivities的pendingIntent设置为当前的builder的相关intent
...
添加一个fragment之前,将其加入backStack中,代码如下:
getSupportFragmentManager().beginTransaction()
.add(detailFragment, "detail")
// 下面这行代码是主要的
.addToBackStack()
.commit();
这样当你回退的时候,就会执行和 add 相反的操作了
设计规则里面讲到一些,不能在fragment变化中,修改back的例子,比如 tabs一类的水平关系 或者 修改content内容
如果你的fragment要通过 修改一些 页面元素, 比如说actionbar的title,当你回退的时候,你还得把actionbar的title改回来,在哪里写呢?可以给FragmentManager添加一个专门的Back按钮监听器:
getSupportFragmentManager().addOnBackStackChangedListener(
new FragmentManager.OnBackStackChangedListener() {
public void onBackStackChanged() {
// Update your UI here.
}
});
这种情况下,就判断webview是否可以回溯,只要可以,那么就回溯web
重写了一个关键方法 onBackPressed 其他的都是改变回退栈的内容,而这个策略是直接改变点击事件的内容
@Override
public void onBackPressed() {
if (mWebView.canGoBack()) {
mWebView.goBack();
return;
}
// Otherwise defer to system default behavior.
super.onBackPressed();
}
有时候会遇到这样的情况,你点击一个按钮,进入了 系统的文件选择页面,这次你home键,退到了主屏幕。然后又点击你的应用icon。
此时却出现的是一个 文件选择页面。这是让人困惑的地方。
如果给 intent (跳到外部应用的)加上一个Flag,就可以解决这个问题:
Intent externalActivityIntent = new Intent(Intent.ACTION_PICK);
externalActivityIntent.setType("image/*");
externalActivityIntent.addFlags(
Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
startActivity(externalActivityIntent);