(三)高级篇____8、实现高效导航——实现临时导航

原文链接:http://docs.eoeandroid.com/training/implementing-navigation/temporal.html
翻译:tyutNo4
更新:2012.10.10

时间导航的实现

时间导航是用来导航之前访问过的画面,用户通过设备上的返回(BACK)按钮可以访问之前的画面。关于这个用户界面模式的进一步描述详见Providing Ancestral and Temporal Navigation【in Designing Effective Navigation 】 和Android Design: Navigation。

Android会处理比较基础的返回导航(详见Tasks and Back Stack )。这节课将通过一些案例来讨论应用程序如何为返回按钮提供专业的逻辑。

通过Fragments来实现BACK导航

当应用程序使用Fragments的时候,每个单独的FragmentTransaction对象都代表上下文的变化,而且这些变化会被压进back栈中。比如你在手机上通过切换fragments(相当于调用一个startActivity()方法)实现了一个master/detail flow流,你应该确保在detail画面按下返回按钮可以返回到master画面。要实现这样的效果,你可以使用addToBackStack(): 

// Works with either the framework FragmentManager or the
// support package FragmentManager (getSupportFragmentManager).
getFragmentManager().beginTransaction()
        .add(detailFragment, "detail")
 
        // Add this transaction to the back stack and commit.
        .addToBackStack()
        .commit();

activity的FragmentManager将会处理返回按钮行为,如果FragmentTransaction对象在back栈中的话。当上述行为发生的话,FragmentManager将会从back栈中取出最近的事务,然后执行倒退操作(e.g.如果这个事务添加了一个fragment,就会执行移除fragment操作)。 如果你的应用程序更新了其他的用户界面元素反映你的fragment的当前状态(比如操作栏),在提交事务的时候要记住更新用户界面。你应该在FragmentManager back栈改变之后更新你的用户界面除非你已经提交了事务。综上你可以通过配置FragmentManager.OnBackStackChangedListener来监听FragmentTransaction的恢复: 

getFragmentManager().addOnBackStackChangedListener(
        new FragmentManager.OnBackStackChangedListener() {
            public void onBackStackChanged() {
                // Update your UI here.
            }
        });

通过WebViews来实现BACK导航

如果你应用程序的一部分是包含在一个WebViews中的话,可以通过浏览历史来适当的返回。这么做的话你可以重写onBackPressed()方法来代理使用WebView,前提是要有历史状态: 

@Override
public void onBackPressed() {
    if (mWebView.canGoBack()) {
        mWebView.goBack();
        return;
    }
 
    // Otherwise defer to system default behavior.
    super.onBackPressed();
}

高度动态的web页面中使用这种机制的话要非常小心,因为很容易产生非常大的历史数据。产生的大量的历史画面(比如那些频繁改变的文档列表)会让你离开当前画面变得非常繁琐冗长。

posted @ 2014-07-31 11:07  ╰→劉じ尛鶴  阅读(140)  评论(0)    收藏  举报