【问题标题】:How to replace fragment of parent layout from child如何从孩子替换父布局的片段
【发布时间】:2017-10-27 09:41:40
【问题描述】:

我已经查看了许多类似的问题但我仍然无法从该容器中可见的片段替换我的主活动的容器布局 (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 中这样做时,指向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?

【问题讨论】:

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


    【解决方案1】:

    不要使用getChildFragmentManager(),因为它属于片段管理器,并且保存当前片段的容器是活动容器。而是使用getSupportFragmentManager()

    另请参阅此声明

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

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

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

    【讨论】:

    • 感谢它现在的工作 :) 与 getActivity() 现在两种方法都运行良好。
    • 最欢迎您。如果我的回答有帮助,请接受:)
    • 我投了赞成票,因为接受答案有时间限制。现在也接受了。
    猜你喜欢
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    • 2015-01-28
    • 2017-04-09
    相关资源
    最近更新 更多