android - 用同一类的另一个 fragment 替换一个 fragment

标签 android android-fragments fragmenttransaction

我有一个 fragment (我们称它为MyFragment),它根据参数中传递的参数扩充不同的布局。
如果 MyFragment 从不同的 fragment 开始,一切都很好。但是,如果 MyFragment 处于 Activity 状态并且我想启动一个具有不同布局参数的新 MyFragment,则 fragmentManager 根本不会创建新 fragment .

data.setInt("Layout index",i);
fragmentTab0 = (Fragment) new MyFragment();
fragmentTab0.setArguments(data);
fragmentTransaction.replace(R.id.fragmentContent, fragmentTab0, "MY");
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();

我如何强制说服fragmentTransaction再次启动 fragment ?

注意:这里重点是我需要重新inflate一个布局,这和之前inflate的布局不同。代码如下:

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

    switch( getArguments().getInt("Layout index") ) {
    case 1:
        rootView = inflater.inflate(R.layout.firstlayout, container, false);
        break;
    case 2:
        rootView = inflater.inflate(R.layout.secondlayout, container, false);
        break;
    case 3:
        rootView = inflater.inflate(R.layout.thirdlayout, container, false);
        break;
    default: break;
    }       

最佳答案

旁路解决方案
说明(胡佛看到)

自源代码为 fragmentTransaction.replace/add/remove 是 不可用 我找不到真正发生的事情。但它是 合理地认为在某些时候它比较当前类(class) name 替换类名,如果它们是 一样。。感谢@devconsole 指出来源 代码。我现在知道为什么会这样了。 <强> FragmentManager.removeFragment() 方法不重置 fragment 状态,它保持 RESUMED,然后 方法 moveToState(CREATED) 只初始化一个 fragment if (f.mState < newState) = if (RESUMED < CREATED) = false 。否则,ergo,它只是恢复 fragment 。

所以为了解决这个问题,我创建了一个几乎是空的 fragment ,它的唯一目的是用目标 fragment 替换自己。

public class JumpFragment {

    public JumpFragment() {
    }

    @Override
    public void onStart() {
        Bundle data = getArguments();
        int containerId = data.getString("containerID");
        String tag = data.getString("tag");
        //Class<?> c = data.get???("class");            
        //Fragment f = (Fragment) c.newInstance();          
        Fragment f = (Fragment) new MyFragment();
        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        f.setArguments(data);
        fragmentTransaction.replace(containerId, f, tag);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();
    }

}

我用它:

data.setInt("Layout index",i);
data.setInt("containerID",R.id.fragmentContent);
data.setString("tag","MY");
fragmentTab0 = (Fragment) new JumpFragment();
fragmentTab0.setArguments(data);
fragmentTransaction.replace(R.id.fragmentContent, fragmentTab0);
fragmentTransaction.commit();

现在没有 fragment 被相同类的 fragment 替换:

MyFragment -> JumpFragment -> MyFragment

我还没有想出如何通过参数包传递类,使其完全通用。

关于android - 用同一类的另一个 fragment 替换一个 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17148285/

相关文章:

java - 从 Google Map 获取结果并将数据传输回之前的 fragment

android - 空指针异常 : FragmentManager. beginTransaction()

android - 在具有非静态 fragment 的布局上有效地使用布局编辑器

android - 尝试使用 MediaPlayer 播放声音时出现 NullPointerException

android - sadio register_driver() 会创 build 备名称吗?

android - 安卓代码注入(inject)

android - 弹出整个 FragmentManager BackStack 时未呈现初始 fragment

android - 使用 MapFragment 在 Activity 中进行数据绑定(bind)

android - fragment 交易时卡住UI

android - Android 无法连接 Mysql 数据库