子片段自动销毁

Kus*_*arg 6 android fragment android-fragments android-nested-fragment

我有一个父片段,即在其上FragmentA膨胀一个子片段FragmentB.在onCreateView函数中FragmentB尝试膨胀另一个片段`FragmentC'.

FragmentA.java

public class FragmentA extends Fragment {

    private static final String TAG = "FragmentA";

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                 Bundle savedInstanceState) {
    /* Inflate the layout for this fragment */
    View view = inflater.inflate(R.layout.root_fragment, container, false);


    FragmentManager manager = getChildFragmentManager();

    FragmentTransaction transaction = manager
        .beginTransaction();
    /*
     * When this container fragment is created, we fill it with our first
         * "real" fragment
         */
    transaction.replace(R.id.container_main, new FragmentRecharge());
    transaction.addToBackStack(null);
    transaction.commit();


    return view;
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
    outState.putString("WORKAROUND_FOR_BUG_19917_KEY", "WORKAROUND_FOR_BUG_19917_VALUE");
    super.onSaveInstanceState(outState);
    }
}
Run Code Online (Sandbox Code Playgroud)

FragmentB.java

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    rootView = inflater.inflate(R.layout.recharge_layout_new, container,

    false);
....

try {
    ((ActivityMain) context).bannerView.setVisibility(View.GONE);
    Fragment fragment = new FragmentC();
//                fragment.setArguments(bundle);
    FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.add(R.id.container_main, fragment);
    fragmentTransaction.addToBackStack("my_fragment");
    fragmentTransaction.commit();
} catch (Exception e) {
    Crashlytics.logException(e);
}

 }  
Run Code Online (Sandbox Code Playgroud)

FragmentC.java

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                 Bundle savedInstanceState) {

    rootView = inflater.inflate(R.layout.recharge_layout_new, container,

    false);
    ....
Run Code Online (Sandbox Code Playgroud)

布局文件:

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/tools"
    android:id="@+id/parent_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/fragment_back_color">

     <FrameLayout
    android:id="@+id/container_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:visibility="visible">

    </FrameLayout>
Run Code Online (Sandbox Code Playgroud)

but it get destroyed automatically and come to `FragmentB`.  How can I fix this issue ?
Run Code Online (Sandbox Code Playgroud)

我试图使用HandlerpostDelayed以1秒的间隔则膨胀FragmentC和它工作正常.这看起来不是解决方案.

        new android.os.Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                try {
                    ((ActivityMain) context).bannerView.setVisibility(View.GONE);
                    Fragment fragment = new FragmentC();
//                fragment.setArguments(bundle);
                    FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
                    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                    fragmentTransaction.add(R.id.container_main, fragment);
                    fragmentTransaction.addToBackStack("my_fragment");
                    fragmentTransaction.commit();
                } catch (Exception e) {
                    Crashlytics.logException(e);
                }
            }
        }, 1000);
Run Code Online (Sandbox Code Playgroud)

Teo*_*cci 0

更新我在 mi Github 帐户 中使用手动嵌套片段添加实现了测试

使用当前版本的 Android 支持,您可以通过 getChildFragmentManager() 嵌套片段。childFragmentManager 背后的基础是它推迟加载,直到前一个片段事务完成。还有另一种方法吗?

当然!没有 ChildManager 嵌套,但是如何呢?好吧,见下文;我们将有一个延迟的片段,它延迟加载,因此其他片段可以加载到其中。

这个想法很简单。然而,Handler 是要找到一个非常方便的类,它可以在当前片段事务完成提交后有效地等待一个空间在主线程上执行(片段会干扰 UI,因此它们在主线程上运行)。

private final Handler handler = new Handler();
private Runnable runPager;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    return inflater.inflate(R.layout.recharge_layout_new, container, false);
}

@Override
public void onActivityCreated(Bundle savedInstanceState)
{
    super.onActivityCreated(savedInstanceState);
    runPager = new Runnable() {

        @Override
        public void run()
        {
          getFragmentManager().beginTransaction().addFragment(R.id.frag_container, FragmentC.newInstance()).commit();
        }
    };
    handler.post(runPager);
}

/**
 * @see android.support.v4.app.Fragment#onPause()
 */
@Override
public void onPause()
{
    super.onPause();
    handler.removeCallbacks(runPager);
}
Run Code Online (Sandbox Code Playgroud)