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)
绕过解决方案
说明(胡佛看到它)
由于源代码。感谢@devconsole 指出源代码。我现在知道为什么会发生这种情况了。该fragmentTransaction.replace/add/remove不可用,我无法找到到底发生了什么。但可以合理地认为,在某个时刻它会将当前类名与替换类名进行比较,如果它们相同则退出。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
我还没有弄清楚如何通过参数包传递该类,以使其完全通用。
| 归档时间: |
|
| 查看次数: |
9690 次 |
| 最近记录: |