适用于灵活片段事务的结构

时间:2016-10-17 09:35:38

标签: android android-fragments

我正在开发一个只有一个登录活动和一个主要活动的应用。我将片段替换为三个级别,例如A-> B-> C或A-> B-> D以及更多这样的场景。我将它们放在后面的堆栈上并在后面按下它们取回它们。就像在背压上一样C,B出现。我有一个场景,我收到推送通知然后点击它应用程序应重定向到C.现在要实现它我必须通过启动屏幕。这意味着在点击通知之前,如果我在D上并且我收到C的通知,那么我将登陆C,但是在背压时我不会来D而是B,因为A-> B> C。那么是否存在一个活动和所有片段的结构,即使我点击通知,我也可以在通知到达之前恢复流程。???即直接将C维持到D,然后按原样定期流动。 谢谢。

3 个答案:

答案 0 :(得分:0)

这可能略微取决于这些片段的内容是什么,但我认为Android文档实际上会建议你现在的行为实际上是正确的。基本上,一旦您从通知中导航到应用程序,您的导航应该与您通常通过浏览屏幕在应用程序中输入该点相同。它应该清除以前的导航历史记录。

文档详细说明了这一点: https://developer.android.com/design/patterns/navigation.html#into-your-app

答案 1 :(得分:0)

首先将TabLayout.OnTabSelectedListener实现到您的片段托管活动,然后覆盖方法onTabSelected get tab position(比如tabPosition),从这个位置尝试在同一个活动中跟随代码(需要更改):

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{

    // TODO Auto-generated method stub
    if ((keyCode == KeyEvent.KEYCODE_BACK))
    {
        if(tabPosition!=0)
        {
            pager.setCurrentItem(tabPosition- 1);
            return true;
        }
        else
        {
            onBackPressed();
        }
    }
    return super.onKeyDown(keyCode, event);

}

答案 2 :(得分:0)

您可以实现自己的自定义backstack。

因此,如果您的历史记录如下:

A-> B-> C-> d

如果事件导致历史记录再次添加C,例如您在上面指定的通知,然后您在上面指定的内容表明您希望历史记录如下所示:

A-> B-> C-> D-&以及c

你目前得到的,你不想要的是:

A-> B-&以及c

为此,您可以在Activity中实现自定义片段历史记录处理。您通常会将片段转换添加到Backstack,而是将片段添加到ArrayList或类似实体。我在下面拼凑了一些代码:

private ArrayList<Fragment> mFragmentHistory = new ArrayList<>();

    private void loadFragment(Fragment fragment, boolean addToHistory) {

       // your fragment transition code here without adding to backstack

       // add the fragment to your custom history
       if (addToHistory) {
           mFragmentHistory.add(fragment);
       }

 }

然后,您需要在同一个Activity的onBackPressed方法中实现处理代码:

@Override
public void onBackPressed() {
     // if the history is not at the "top", i.e. only one (or 0) fragments in history
     if (mFragmentHistory.size() > 1) {
       // remove the last (==current) fragment from history
       mFragmentHistory.remove(mFragmentHistory.size() - 1);

       // get new last fragment from history - this is now the one to load 
       Fragment loadFragment = mFragmentHistory.get(mFragmentHistory.size() - 1);

       // load this fragment, don't add it to the history
       loadFragment(loadFragment, false);

     } else {
        // perform default system back or implement your custom handler here
        super.onBackPressed();
     }
}

您必须考虑将状态维持在活动重启(屏幕旋转等)上。