我有一个 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)
只初始化一个 fragmentif (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/