簡體   English   中英

帶有后退按鈕的片段導航具有不良行為

[英]Fragment navigation with back button undesired behavior

我的應用程序中的onBackPressed()實現存在問題。 我有一個帶有differents標簽的片段。 用戶可以使用導航視圖和后退按鈕在片段之間導航。 一切都按預期工作,但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-> Initial

我也嘗試過這樣的交易:

    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()刪除片段,我不想這樣做。

我也有同樣的問題,我通過為片段實現自己的歷史堆棧來解決了這個問題。 每當我想向堆棧中添加一個片段時,我都會瀏覽堆棧並刪除與我要添加的片段具有相同類的片段(如果有的話)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM