如何从子代替父级布局的片段

时间:2017-10-27 09:41:40

标签: java android android-layout android-fragments navigation

我已经看过许多类似的问题但是我仍然无法从该容器中可见的片段替换My Main Activity的容器布局(FrameLayout)。
这是我正在尝试做的事情我有导航抽屉的主要活动和导航抽屉项目点击我相应地改变片段,我成功,直到这个。这些片段是登录,注册,类别,联系我们等。我正在更改/替换片段FragmentManagerFragmentTransaction其方法替换。检查下面的代码

public void changeFragment(int position) {
        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        Fragment fragment = new Fragment();
        BlankFragment blankFragment = new BlankFragment();

        switch (position) {
            case 0:
                fragment = new FragMain();
                break;
            case 1:
                fragment = new FragPrivacyPolicy();
                break;
            case 2:
                fragment = new SettingsFragment();
                break;
            case 101:
                fragment = new FragLogin();
                break;
            case 102:
                fragment = new FragRegister();
                break;
            case 103:
                fragment = new FragEditAccount();
                break;
            case 104:
                fragment = new FragOrderHistory();
                break;
            case 105:
                fragment = new FragForgotPass();
                break;
            case 106:
                fragment = new FragOrderDetail();
                break;
            case 108:
                fragment = new FragAboutUs();
                break;
            case 109:
                fragment = new FragContactUs();
                break;
            case 110:
                fragment = new FragMain();
                break;
        }

        transaction.replace(R.id.flFragments, fragment);
        transaction.commit();
    }

我的所有片段extends Fragment都能正常工作。当我尝试在此mainActivity容器中可见的一个片段中调用此方法时,问题就出现了。假设我在FragLogin中有一个textView,说“没有帐户注册”,所以单击此textView我必须在mainActivity的同一容器中打开FragRegister。当我在FragLogin App Crashes中指向transaction.commit();

时这样做
MainActivity activity = new MainActivity();
activity.changeFragment(102);

当我尝试这样的时候

    FragRegister fragRegister = new  FragRegister();
//    Fragment fragRegister = new  FragRegister();
    FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
    transaction.addToBackStack(null);
    transaction.replace(R.Id.flFragments, fragRegister).commit();

它不会将R.Id.flFragments识别为mainActivity中不在FragLogin中的内容。

那么如何从FragLogin中替换mainActivity容器中的FragRegister呢?

1 个答案:

答案 0 :(得分:2)

不要使用getChildFragmentManager()因为它属于片段管理器而且持有当前片段的容器是活动容器。相反使用getSupportFragmentManager()

另见这个例子

MainActivity activity = new MainActivity();
activity.changeFragment(102);

您正在创建一个已创建的mainactivity新对象。您必须使用getActivity()从片段调用activity方法。请像这样调用changeFragment方法。

((MainActivity)getActivity()).changeFragment(102);