我有3个片段A,B,C.我编写了一段代码来替换它们并维护后退堆栈:
I have 3 fragment A, B,C.I wrote piece of code for replacing them and maintaining backstack:
public void addFragment(Fragment fragmentToAdd, String fragmentTag) { FragmentManager supportFragmentManager = getSupportFragmentManager(); Fragment activeFragment = getActiveFragment(); FragmentTransaction fragmentTransaction = supportFragmentManager .beginTransaction(); if (null != activeFragment) { fragmentTransaction.hide(activeFragment); } fragmentTransaction.replace(R.id.layout_child_activity, fragmentToAdd, fragmentTag); if (supportFragmentManager.getBackStackEntryCount() > 1) { supportFragmentManager.popBackStack(); } fragmentTransaction.addToBackStack(fragmentTag); fragmentTransactionmit(); }这是这段代码
if (supportFragmentManager.getBackStackEntryCount() > 1) { supportFragmentManager.popBackStack(); }如果堆栈长度大于1,我将最新的片段用于弹出.现在,由于这个原因,当长度大于1时,它会一次又一次地调用onCreate视图. 像:
I using for pop the latest fragment if stack length is more than 1. Now due to this when length is going greater than 1 than it is calling onCreate view again and again. Like :
为什么我会出现这种行为?当我删除该斜体代码时,它没有发生.
Why I am getting such kind of behavior ? When I am removing that italic code than it is not happening.
推荐答案比行为正常的是,如文档所说,来自后台堆栈事务. Backstack永远不会保存Fragments,而只会保存事务
Than behavior is normal, coming from the backstack transaction, as the docs say. The backstack never saves Fragments, it just saves the transaction
developer.android/intl/es /guide/components/fragments.html
我不确定(如果不确定)这是最好的方法,但是 当我想清除所有交易时,我会这样做
What I do, I am not sure if, is it the best way but when I want to clear all the transactions I do this
1)在您的活动中检查后备堆栈中是否有任何交易, 并在片段中添加一个标志,如果是A
1) INSIDE YOUR ACTIVITY check if is there any transactions in the back stack, and add a flag inside your fragment, in your case is A
int backStackCount = getSupportFragmentManager().getBackStackEntryCount(); if(backStackCount > 0) { Transactions.MUST_DETACH_FROM_BACKSTACK = true; getSupportFragmentManager().popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); }2)在片段A内,获取标志并删除片段onCreateView并返回null,像这样
2) Inside your fragment A, get the flag and Remove the fragment onCreateView and return null like this
public class Transactions extends android.support.v4.app.Fragment{ public static boolean MUST_DETACH_FROM_BACKSTACK = false; public Transactions() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.i("FRAGMENT", "onCreateView "+MUST_DETACH_FROM_BACKSTACK); // Inflate the layout for this fragment if (MUST_DETACH_FROM_BACKSTACK) { MUST_DETACH_FROM_BACKSTACK = false; getActivity().getSupportFragmentManager().beginTransaction().remove(this)mit(); return null; } return inflater.inflate(R.layout.fragment_transactions, container, false); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); Log.i("FRAGMENT", "onViewCreated"); if(view != null){ Log.i("FRAGMENT", "ThreadStarted"); startThread(view); } }请小心,我在
OnCreateView()即使具有getActivity().getSupportFragmentManager().beginTransaction().remove(this)mit();
even with getActivity().getSupportFragmentManager().beginTransaction().remove(this)mit();
因此,如果您有任何conde onResume方法,则应正确处理它
So if you have any conde onResume method you should handle it properly
更多推荐
popBackStack导致一次又一次调用片段的oncreateView
发布评论