【问题标题】:Fragment navigation with back button undesired behavior带有后退按钮不良行为的片段导航
【发布时间】:2018-07-15 20:57:49
【问题描述】:

我的应用程序中的 onBackPressed() 实现存在问题。我有一个带有不同标签的片段。用户可以使用导航视图和后退按钮在片段之间导航。一切都按预期工作,除非 FragmentTransaction 像这样:

初始片段->A->B->C->A

当我使用后退按钮返回时,我想要实现的行为是A->C->B->Initial。

相反,我得到 A->B->C->A->Initial

我怎样才能完成我想要的行为?

这是我目前所拥有的:

private int backStackEntries = 0;

    public void onBackPressed() {
    Log.d(TAG,"Number of fragments in back: "+backStackEntries);

    NewsListFragment fragment = (NewsListFragment) getSupportFragmentManager().findFragmentByTag(currentFrag);

    backStackEntries-=1;
    if(backStackEntries<0)
        backStackEntries = 0;

    if(fragment.getTag().equals(News_TAG[0])){
        if(fragment.getParserMaker().isRunning()){
            moveTaskToBack(true);
        }
        else{
            finish();
        }
    }
    else{
        currentFrag = getSupportFragmentManager().getBackStackEntryAt(backStackEntries).getName();
        getSupportFragmentManager().beginTransaction()
                .hide(fragment)
                .show(getSupportFragmentManager().findFragmentByTag(currentFrag))
                .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                .commit();
    }
}

private void makeFragmentTransaction(String[] urls, int item,String _TAG) {
    Bundle bundle = new Bundle();
    bundle.putStringArray("urls", urls);

    NewsListFragment newsFragment = (NewsListFragment) getSupportFragmentManager().findFragmentByTag(_TAG);
    if(newsFragment == null){
        newsFragment = new NewsListFragment();
    }
    newsFragment.setArguments(bundle);

    if(currentFrag == null){
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.container, newsFragment, _TAG)
                .addToBackStack(_TAG)
                .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                .commit();
        currentFrag = _TAG;
    }

    else if(!newsFragment.isAdded()){
        getSupportFragmentManager().beginTransaction()
                .hide(getSupportFragmentManager().findFragmentByTag(currentFrag))
                .add(R.id.container,newsFragment,_TAG)
                .addToBackStack(_TAG)
                .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                .commit();
        currentFrag = _TAG;
        backStackEntries+=1;
    }
    else if(!currentFrag.equals(_TAG)){
        getSupportFragmentManager().beginTransaction()
                .hide(getSupportFragmentManager().findFragmentByTag(currentFrag))
                .show(newsFragment)
                .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                .commit();
        backStackEntries+=1;
        currentFrag = _TAG;

    }

    navigationView.setCheckedItem(item);
    drawerLayout.closeDrawers();
}

添加最后一个 backStackEntries+=1; 会产生奇怪的行为,删除该行会产生交易,但会产生另一个交易问题:

初始(返回)->B->C

按返回键:C->初始

我也尝试过这样的交易:

    getSupportFragmentManager().beginTransaction()
            .replace(R.id.container, newsFragment, _TAG)
            .addToBackStack(_TAG)
            .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
            .commit();
    currentFrag = _TAG;

而 onBackPressed 是这样的:

NewsListFragment fragment = (NewsListFragment) getSupportFragmentManager().findFragmentByTag(currentFrag);
if (getSupportFragmentManager().getBackStackEntryCount() > 1) {
        getSupportFragmentManager().popBackStack();
    } else {
        if (fragment.getParserMaker().isRunning()) {
            moveTaskToBack(true);
        } else {
            finish();
        }
    }

这也会导致不良行为,并且 popBackStack() 会删除我不想这样做的片段。

【问题讨论】:

    标签: java android android-fragments navigation


    【解决方案1】:

    我也遇到了同样的问题,我通过为片段实现自己的历史堆栈来解决它。每次我想向堆栈中添加一个片段时,我都会查看堆栈并删除与我要添加的片段具有相同类的片段(如果有的话)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-24
      • 2011-12-18
      相关资源
      最近更新 更多