Объявление Android 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();
}
});
Ответы
Ответ 1
Вы начинаете FragmentTransaction за пределами OnItemClickListener
. Таким образом, вы пытаетесь сделать commit()
одно FragmentTransaction каждый раз, когда пользователь щелкает элемент в вашем ListView.
Вам нужно начать новый 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();
}
});
Ответ 2
вы можете использовать этот метод для замены фрагмента друг с другом, просто назовите это
делают ли они глобальные
YourFragment1 frg1 = new YourFragment1 ();
YourFragment2 frg1 = new YourFragment2 ();
И затем назовите его
openFragment(frg1);
или
openFragment(frg2);
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();
}
Ответ 3
Ошибка
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();
}
});
Надеюсь, это очистит ваши сомнения.
Ответ 4
У меня была такая же проблема, и я решил, создав новый экземпляр FragmentTransaction
.
Просто добавьте каждый раз ниже строки до добавить/ заменить фрагмент.
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
Надеюсь, это поможет вам.
Ответ 5
Я решил проблему
после вызова commit()
и снова заменяя фрагмент, вы должны начать с
fragmentTransaction = fragmentManager.beginTransaction();
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();
Ответ 6
Посмотрите на этот сценарий
Мне нужно добавить новый фрагмент для каждого элемента списка. Просто инициализировать транзакцию фрагмента при каждом щелчке элемента.
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;
}