gpt4 book ai didi

java - 使用后退按钮进行 fragment 导航是不良行为

转载 作者:太空宇宙 更新时间:2023-11-04 10:19:08 24 4
gpt4 key购买 nike

我的应用程序中的 onBackPressed() 实现存在问题。我有一个带有不同标签的 fragment 。用户可以使用导航 View 和后退按钮在 fragment 之间导航。一切都按预期工作,除了 FragmentTransaction 如下所示:

初始 fragment ->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() 会删除 fragment ,这是我不想做的。

最佳答案

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

关于java - 使用后退按钮进行 fragment 导航是不良行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51352175/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com