Android Back回退按钮

上一节中讲了 up 按钮, up按钮是在UI中实现的。上一节中有时候还误称为 back。

但是,真正的back按钮,其实是不需要再android UI中实现的,因为所有的android设备都有,(左下或者右下)

一般来说,back按钮就是维护一个简单的回退栈,但是在某一些情况下,需要指明back按钮的行为,以达到最好的用户体验


哪些情况下需要指定back按钮的行为

非常典型

  1. 用户通过 通知,桌面组件,或者 drawer 直接到达很深层的Activity的时候,(这时back stack栈差不多是空的,一回退会直接退出这个app)
  2. 当用户在fragment之间做选择的时候,此时back用户意图不一定是退到上一个Activity,说不定只是为了退到上一个fragment
  3. 当用户在使用webview的时候,那么back坑定是回退到上一个页面,而不是Activity

对于第一种情况

上一节中有讲到在< 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之间的Back按钮

添加一个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页面

这种情况下,就判断webview是否可以回溯,只要可以,那么就回溯web

重写了一个关键方法 onBackPressed 其他的都是改变回退栈的内容,而这个策略是直接改变点击事件的内容

@Override
public void onBackPressed() {
    if (mWebView.canGoBack()) {
        mWebView.goBack();
        return;
    }

    // Otherwise defer to system default behavior.
    super.onBackPressed();
}

Ps:当跳转到外部应用的时候

有时候会遇到这样的情况,你点击一个按钮,进入了 系统的文件选择页面,这次你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);

你可能感兴趣的:(android学习)