Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了android – popBackStack导致一次又一次调用片段的oncreateView大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有3个片段A,B,C.我写了一段代码来替换它们并维护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);
        fragmenttransaction.commit();
    }

在这代码

if (supportFragmentManager.getBACkStackEntryCount() > 1) {
    supportFragmentManager.popBACkStack();
}

如果堆栈长度大于1,我使用pop来获取最新的片段.现在由于这个,当长度大于1时,它会一次又一次地调用onCreate视图.
喜欢 :

>打开A.
>开放B.
>打开C.(如果打开C. onCreateView的A被调用.)

为什么我会遇到这种行为?当我删除斜体代码时,它没有发生.

解决方法

正如文档所说,正如行为是正常的,来自后台交易. BACkstack,从不保存Fragments,它只是保存事务

http://developer.android.com/intl/es/guide/components/fragments.html

做了什么,我不确定它是否是最好的方式,但是
当我想清除我做的所有交易

1)在您的活动中检查后堆栈中是否有任何交易,
并在你的片段中添加一个标志,在你的情况下是A.

int BACkStackCount = getSupportFragmentManager().getBACkStackEntryCount();

       if(BACkStackCount > 0) {
           transactions.MUST_DETACH_FROM_BACKSTACK = true;
           getSupportFragmentManager().popBACkStackImmediate(null,FragmentManager.POP_BACK_STACK_INCLUSIVE);
       }

2)在你的片段A里面,获取标志并删除fragent onCreateView并像这样返回null

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).commit();
        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);
    }
}

但要小心我得到onResume()之后调用

OnCreateView()

即使使用getActivity().getSupportFragmentManager().begintransaction().remove(this).commit();

因此,如果你有任何conde onResume方法,你应该适当地处理它

大佬总结

以上是大佬教程为你收集整理的android – popBackStack导致一次又一次调用片段的oncreateView全部内容,希望文章能够帮你解决android – popBackStack导致一次又一次调用片段的oncreateView所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。