防止popBackStack中多次添加同一个Fragment
Prevent the same Fragment to be added multiple times in popBackStack
我的 activity 由 3 个嵌套片段组成。有我的MainFragment
默认显示,ProductFragment
可以从里面调用,然后DetailFragment
可以从ProductFragment
.
调用
我可以在 ProductFragment
和 DetailFragment
之间来回切换。通过这样做,popStackBack 方法正在积累相似的片段。然后,如果我点击后退按钮,它将返回我调用它们的所有片段。
避免在后台堆栈中保留相同片段的正确方法是什么?
编辑:
我首先调用我的主要片段:
if (savedInstanceState == null) {
getFragmentManager()
.beginTransaction()
.add(R.id.container, new SearchFragment(), "SEARCH_TAG")
.commit();
}
这是从 activity 调用片段的代码:
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.setCustomAnimations(R.animator.enter_from_bottom, R.animator.exit_to_top, R.animator.enter_from_bottom, R.animator.exit_to_top);
ft.replace(R.id.container, new FactFragment(), "FACT_TAG");
ft.addToBackStack("FACT_TAG");
ft.commit();
然后,点击返回:
@Override
public void onBackPressed() {
getFragmentManager().popBackStack();
}
我试图获取当前片段的标签并执行一些与之相关的特定代码,但效果不佳。我还尝试 addToBackStack()
仅当当前 Fragment 尚未添加到 backStack 但它弄乱了我的片段视图时。
使用片段的方法isAdded()
评估插入。例如:
if(!frag.isAdded()){
//do fragment transaction and add frag
}
这是我的解决方案。也许很脏,但它有效。我实现了一种方法,该方法 returns 在单击后退按钮之前显示的片段标签:
public String getActiveFragment() {
if (getFragmentManager().getBackStackEntryCount() == 0) {
return null;
}
String tag = getFragmentManager()
.getBackStackEntryAt(getFragmentManager()
.getBackStackEntryCount() - 1)
.getName();
return tag;
}
然后,在我的 onBackPressed()
方法上:
// Get current Fragment tag
String currentFrag = getActiveFragment();
if(currentFrag.equals("PRODUCT_TAG")) {
// New transaction to first Fragment
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.setCustomAnimations(R.animator.enter_from_right, R.animator.exit_to_left, R.animator.enter_from_right, R.animator.exit_to_left);
ft.replace(R.id.container, new SearchFragment(), "MAIN_TAG");
ft.commit();
} else {
// Go to Fragment-1
getFragmentManager().popBackStack();
}
这是我的解决方案:
Fragment curFragment = fragmentManager.findFragmentById(R.id.frameLayout);
if(curFragment != null
&& curFragment.getClass().equals(fragment.getClass())) return;
// add the fragment to BackStack here
Xamarin.Android
(C#) 版本:
var curFragment = fragmentManager.FindFragmentById(Resource.Id.frameLayout);
if (curFragment != null
&& curFragment.GetType().Name == fragment.GetType().Name) return;
// add the fragment to BackStack here
这是我通过片段管理器检查重复插入的方便而简单的解决方案
首先,我检查是否是第一次添加片段,然后我检查片段是否使用片段管理器呈现
Fragment fragment = getSupportFragmentManager().findFragmentByTag("firstFragment");
if (fragment == null) {
getSupportFragmentManager().beginTransaction().add(R.id.frameLayout, new FirstFragment(), "firstFragment")
.addToBackStack(null)
.commit();
}else if(!fragment.isAdded()){
getSupportFragmentManager().beginTransaction().add(R.id.frameLayout, new FirstFragment(), "firstFragment")
.addToBackStack(null)
.commit();
}
我的 activity 由 3 个嵌套片段组成。有我的MainFragment
默认显示,ProductFragment
可以从里面调用,然后DetailFragment
可以从ProductFragment
.
我可以在 ProductFragment
和 DetailFragment
之间来回切换。通过这样做,popStackBack 方法正在积累相似的片段。然后,如果我点击后退按钮,它将返回我调用它们的所有片段。
避免在后台堆栈中保留相同片段的正确方法是什么?
编辑:
我首先调用我的主要片段:
if (savedInstanceState == null) {
getFragmentManager()
.beginTransaction()
.add(R.id.container, new SearchFragment(), "SEARCH_TAG")
.commit();
}
这是从 activity 调用片段的代码:
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.setCustomAnimations(R.animator.enter_from_bottom, R.animator.exit_to_top, R.animator.enter_from_bottom, R.animator.exit_to_top);
ft.replace(R.id.container, new FactFragment(), "FACT_TAG");
ft.addToBackStack("FACT_TAG");
ft.commit();
然后,点击返回:
@Override
public void onBackPressed() {
getFragmentManager().popBackStack();
}
我试图获取当前片段的标签并执行一些与之相关的特定代码,但效果不佳。我还尝试 addToBackStack()
仅当当前 Fragment 尚未添加到 backStack 但它弄乱了我的片段视图时。
使用片段的方法isAdded()
评估插入。例如:
if(!frag.isAdded()){
//do fragment transaction and add frag
}
这是我的解决方案。也许很脏,但它有效。我实现了一种方法,该方法 returns 在单击后退按钮之前显示的片段标签:
public String getActiveFragment() {
if (getFragmentManager().getBackStackEntryCount() == 0) {
return null;
}
String tag = getFragmentManager()
.getBackStackEntryAt(getFragmentManager()
.getBackStackEntryCount() - 1)
.getName();
return tag;
}
然后,在我的 onBackPressed()
方法上:
// Get current Fragment tag
String currentFrag = getActiveFragment();
if(currentFrag.equals("PRODUCT_TAG")) {
// New transaction to first Fragment
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.setCustomAnimations(R.animator.enter_from_right, R.animator.exit_to_left, R.animator.enter_from_right, R.animator.exit_to_left);
ft.replace(R.id.container, new SearchFragment(), "MAIN_TAG");
ft.commit();
} else {
// Go to Fragment-1
getFragmentManager().popBackStack();
}
这是我的解决方案:
Fragment curFragment = fragmentManager.findFragmentById(R.id.frameLayout);
if(curFragment != null
&& curFragment.getClass().equals(fragment.getClass())) return;
// add the fragment to BackStack here
Xamarin.Android
(C#) 版本:
var curFragment = fragmentManager.FindFragmentById(Resource.Id.frameLayout);
if (curFragment != null
&& curFragment.GetType().Name == fragment.GetType().Name) return;
// add the fragment to BackStack here
这是我通过片段管理器检查重复插入的方便而简单的解决方案
首先,我检查是否是第一次添加片段,然后我检查片段是否使用片段管理器呈现
Fragment fragment = getSupportFragmentManager().findFragmentByTag("firstFragment");
if (fragment == null) {
getSupportFragmentManager().beginTransaction().add(R.id.frameLayout, new FirstFragment(), "firstFragment")
.addToBackStack(null)
.commit();
}else if(!fragment.isAdded()){
getSupportFragmentManager().beginTransaction().add(R.id.frameLayout, new FirstFragment(), "firstFragment")
.addToBackStack(null)
.commit();
}