【问题标题】:Change Activities' Fragment Inside the Fragment在 Fragment 内更改活动的 Fragment
【发布时间】:2017-01-30 22:25:38
【问题描述】:

我有一个 Activity,在那个 Activity 里面我有 Fragment。
该片段有 OnClick 方法应该
切换到另一个视图。
我想要的是使用
内部的 onclick 方法更改内部视图 分片并使用同一个activity。

到目前为止,这只是我能做的。

Fragment mFragment = null;
        Class fragmentClass;
        fragmentClass = LoginSignup.class;
        try {
            mFragment = (Fragment) fragmentClass.newInstance();
        } catch (Exception mE) {
            Log.e(TAG, mE.toString());
        }

        FragmentManager mFragmentManager = getSupportFragmentManager();
        mFragmentManager.beginTransaction().replace(R.id.frameLayout, mFragment).commit();  

【问题讨论】:

  • 那么问题是什么?
  • 我需要更改第一个片段中的活动片段。
  • 您不能在同一视图中更改片段的活动。而不是你可以调用子片段!
  • 您阅读过官方文档中的Communicating With Other Fragments 吗?此外,您使用一种非常非正统的方法来创建新的 Fragment。
  • 使用Class 对象并将其转换为Fragment。通常在 Fragment 类中有一个静态的 newInstance() 方法,它返回一个新的 Fragment 并在此过程中为其分配任何参数。它使用Fragment.newInstance() 调用(示例在dcoumentation here a couple of paragraphs down 中显示)

标签: android android-studio android-fragments


【解决方案1】:

使用下面的方法

public static void openFragment(FragmentManager manager, Fragment targetFragment) {

    try {

        String fragmentName = targetFragment.getClass().getName();
        manager.popBackStack();
        manager.beginTransaction()
                .replace(R.id.frameLayout, targetFragment, fragmentName)
                .addToBackStack(fragmentName)
                .commit();

    } catch (Exception e) {
        e.printStackTrace();
    }

}

每次打开片段时调用此方法。您必须将两个参数传递给此方法。 targetFragment 是您要打开的片段。

【讨论】:

  • 这很棒。谢谢先生。这正是我正在寻找的。谢谢
【解决方案2】:

我总是使用EventBus通知活动或实现接口来更改片段中的片段。

界面:

public interface LoginViewInterface {

     void moveToLoginView();

     void moveToInsertView();   
}

活动:

public class LoginActivity implements LoginViewInterface {

    private FragmentManager manager;
    private FragmentTransaction transaction;
    private List<BaseFragment> fragmentList;
    private LoginFragment loginFragment;
    private InsertFragment insertFragment;

    private void InitFragment(){
        manager = getFragmentManager();
        insertFragment = (LogModeFragment) manager.findFragmentById(R.id.login_insert);
        loginFragment = (LoginFragment) manager.findFragmentById(R.id.login_login);
        insertFragment.InitInterface(this);
        loginFragment.InitInterface(this);
        fragmentList = new ArrayList<>();
        fragmentList.add(loginFragment);
        fragmentList.add(insertFragment);
        transaction = manager.beginTransaction().hide(fragmentList.get(0))
                .hide(fragmentList.get(1));
        transaction.show(fragmentList.get(0)). commitAllowingStateLoss();
    }


    @Override
    public void moveToLoginView() {
         transaction.hide(fragmentList.get(0));
         transaction.show(fragmentList.get(1));
         transaction.commitAllowingStateLoss();       
    }

    @Override
    public void moveToInsertView() {
        transaction.hide(fragmentList.get(1));
        transaction.show(fragmentList.get(0));
        transaction.commitAllowingStateLoss();
    }
}

片段:

class InsertFragment extends BaseFragment{
    LoginViewInterface dataInterface;
    public void InitInterface(LoginViewInterface dataInterface) {
        this.dataInterface = dataInterface;
    }

    private doChange(){
        dataInterface.moveToInsertView();
    }
}

【讨论】:

  • 谢谢先生。我已经得到了答案。但我也会看看这个。将来可能会对我有所帮助。谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-20
相关资源
最近更新 更多