JPs*_*JPs 36 android android-fragments fragmenttransaction
我的错误:
java.lang.IllegalStateException:已经调用了commit
我的代码:
final FragmentTransaction fragmentTransaction =getFragmentManager().beginTransaction();
f1_fragment = new F1_Fragments();
f2_fragment = new F2_Fragments();
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
parent.getItemAtPosition(position);
if(position==0){
fragmentTransaction.replace(android.R.id.content, f1_fragment);
}else{
fragmentTransaction.replace(android.R.id.content, f2_fragment);
}
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
});
Run Code Online (Sandbox Code Playgroud)
Tan*_*.7x 60
你正在开始FragmentTransaction OnItemClickListener
.因此,commit()
每次用户单击ListView中的项目时,您都会尝试单个FragmentTransaction.
每次打算执行任意数量的Fragment操作时,您需要开始一个新的FragmentTransaction.
一个简单的修复程序如下所示:
f1_fragment = new F1_Fragments();
f2_fragment = new F2_Fragments();
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
FragmentTransaction fragmentTransaction =getFragmentManager().beginTransaction();
parent.getItemAtPosition(position);
if(position==0){
fragmentTransaction.replace(android.R.id.content, f1_fragment);
}else{
fragmentTransaction.replace(android.R.id.content, f2_fragment);
}
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
});
Run Code Online (Sandbox Code Playgroud)
您可以使用此方法相互替换片段,只需调用它即可
那些是全球性的
YourFragment1 frg1 = new YourFragment1 ();
YourFragment2 frg1 = new YourFragment2 ();
Run Code Online (Sandbox Code Playgroud)
然后叫它
openFragment(frg1);
Run Code Online (Sandbox Code Playgroud)
要么
openFragment(frg2);
Run Code Online (Sandbox Code Playgroud)
OpenFragment:
private void openFragment(final Fragment fragment) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.container, fragment);
transaction.addToBackStack(null);
transaction.commit();
}
Run Code Online (Sandbox Code Playgroud)
我遇到了同样的问题,我通过创建新的FragmentTransaction
.
只需在添加/替换片段之前每次添加以下行即可。
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
Run Code Online (Sandbox Code Playgroud)
希望这会对您有所帮助。
小智 5
错误
java.lang.IllegalStateException:已经调用了commit
显示在第一次FragmentTransaction
调用后已经完成commit()
并且您再次呼叫commit()
,这往往再次完成它.因此,它成为一个非法的国家FragmentTransaction
.
根据您的代码,您使用相同的方法FragmentTransaction
来更改片段.但是,在第一次commit()
调用之后,FragmentTransaction
已完成,您需要再次开始执行任何操作Fragments
.
你可以改变你ClickListner
的:
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
fragmentTransaction = getSupportFragmentManager().beginTransaction();
parent.getItemAtPosition(position);
if(position==0){
fragmentTransaction.replace(android.R.id.content, f1_fragment);
}else{
fragmentTransaction.replace(android.R.id.content, f2_fragment);
}
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
});
Run Code Online (Sandbox Code Playgroud)
我希望它能清除你的怀疑.
小智 5
看这种情况
我需要在每个列表项单击上添加新的片段。只需在每个项目点击上初始化片段交易即可。
switch (v.getId()) {
case R.id.tvaddExpense:
fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.add(R.id.containerFucntionsList, new Fragment1());
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
break;
case R.id.relEvents:
fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.containerFucntionsList, new Fragment2());
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
break;
}
Run Code Online (Sandbox Code Playgroud)