popBackStack导致一次又一次调用片段的oncreateView

编程入门 行业动态 更新时间:2024-10-26 15:20:49
本文介绍了popBackStack导致一次又一次调用片段的oncreateView的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我有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 :

  • 打开A.
  • 打开B.
  • 打开C. (如果打开C,则调用A的onCreateView.)
  • 为什么我会出现这种行为?当我删除该斜体代码时,它没有发生.

    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

    本文发布于:2023-11-27 23:53:09,感谢您对本站的认可!
    本文链接:https://www.elefans.com/category/jswz/34/1640115.html
    版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
    本文标签:片段   popBackStack   oncreateView

    发布评论

    评论列表 (有 0 条评论)
    草根站长

    >www.elefans.com

    编程频道|电子爱好者 - 技术资讯及电子产品介绍!