用同一类的另一个片段替换片段

ilo*_*mbo 7 android android-fragments fragmenttransaction

我有一个fragment(让我们称之为MyFragment)根据参数中传递的参数膨胀不同的布局.
如果MyFragment是从不同的片段启动的,那么一切都很好.但是如果MyFragment处于活动状态并且我想要使用不同的布局参数启动新的MyFragment,则fragmentManager根本不会创建新的片段.

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

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

注意:这里重点是我需要再次充气布局,这与之前充气的布局不同.代码如下:

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;
    }       
Run Code Online (Sandbox Code Playgroud)

ilo*_*mbo 3

绕过解决方案
说明(胡佛看到它)

由于源代码fragmentTransaction.replace/add/remove不可用,我无法找到到底发生了什么。但可以合理地认为,在某个时刻它会将当前类名与替换类名进行比较,如果它们相同则退出。。感谢@devconsole 指出源代码。我现在知道为什么会发生这种情况了。该FragmentManager.removeFragment() 方法不会重置片段状态,它保持RESUMED,然后该方法仅初始化一个moveToState(CREATED)片段if (f.mState < newState)==if (RESUMED < CREATED)false。否则,因此,它只是恢复片段。

因此,为了解决这个问题,我创建了一个几乎空的片段,其唯一目的是用目标片段替换自身。

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();
    }

}
Run Code Online (Sandbox Code Playgroud)

我用它:

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();
Run Code Online (Sandbox Code Playgroud)

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

MyFragment -> JumpFragment -> MyFragment

我还没有弄清楚如何通过参数包传递该类,以使其完全通用。