错误提示:
Process: com.example.accountapp, PID: 3987
java.lang.IllegalStateException: Could not execute method for android:onClick
at androidx.appcompat.app
Caused by: java.lang.IllegalStateException: commit already called
at androidx.fragment.app.BackStackRecord.commitInternal(BackStackRecord.java:315)
at androidx.fragment.app.BackStackRecord.commit(BackStackRecord.java:294)
这是一个Android应用程序中的严重错误,其中涉及到"java.lang.IllegalStateException"异常。具体来说,错误信息是"Could not execute method for android:onClick",并且也提到了"commit already called"的问题。这种错误通常出现在Fragment的事务提交上,可能是由于重复调用了commit方法导致的。
原因:
在Android中,每个 FragmentTransaction
对象只能提交一次。一旦调用了 commit()
方法提交一个事务,该事务就被提交到活动的 FragmentManager
中,之后再次调用 commit()
方法会导致 "Can not perform this action after onSaveInstanceState" 异常或者 "commit already called" 异常。这是因为 commit()
方法已经被调用,再次调用会导致不可预测的行为。
原有代码:
package com.example.accountapp.pages;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentContainerView;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import com.example.accountapp.R;
import com.example.accountapp.fragment.addaccount.AddExchangeFragment;
import com.example.accountapp.fragment.addaccount.AddInFragment;
import com.example.accountapp.fragment.addaccount.AddOutFragment;
public class AddAccount extends AppCompatActivity {
private int tabIndex = 1; //当前选中的tab页
private TextView tab1,tab2,tab3,cancelTxt;
private View divider1,divider2;
private FragmentContainerView fragmentContainerView;
private FragmentManager fragmentManager;
private FragmentTransaction fragmentTransaction;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_account);
initView();
// 动态加载 Fragment
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();//开启事务
fragmentTransaction.add(R.id.icon_frag,new AddOutFragment());
fragmentTransaction.commit();
}
// 切换 tab页 点击方法
public void tabChange(View view) {
int index = view.getId();
if(index == R.id.tab1){
System.out.println("支出");
divider1.setVisibility(View.INVISIBLE);
divider2.setVisibility(View.VISIBLE);
tab1.setBackgroundResource(R.drawable.selec_tab);
tab3.setBackgroundResource(0);
tab2.setBackgroundResource(0);
fragmentTransaction.replace(R.id.icon_frag,new AddOutFragment());
}else if(index == R.id.tab2){
System.out.println("收入");
divider1.setVisibility(View.INVISIBLE);
divider2.setVisibility(View.INVISIBLE);
tab2.setBackgroundResource(R.drawable.selec_tab);
tab1.setBackgroundResource(0);
tab3.setBackgroundResource(0);
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();//开启事务
fragmentTransaction.replace(R.id.icon_frag,new AddInFragment());
}else{
System.out.println("转账");
divider1.setVisibility(View.VISIBLE);
divider2.setVisibility(View.INVISIBLE);
tab3.setBackgroundResource(R.drawable.selec_tab);
tab1.setBackgroundResource(0);
tab2.setBackgroundResource(0);
fragmentTransaction.replace(R.id.icon_frag,new AddExchangeFragment());
}
fragmentTransaction.commit();
}
}
修改过后:
每次创建新的 FragmentTransaction
对象
package com.example.accountapp.pages;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentContainerView;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import com.example.accountapp.R;
import com.example.accountapp.fragment.addaccount.AddExchangeFragment;
import com.example.accountapp.fragment.addaccount.AddInFragment;
import com.example.accountapp.fragment.addaccount.AddOutFragment;
public class AddAccount extends AppCompatActivity {
private int tabIndex = 1; //当前选中的tab页
private TextView tab1,tab2,tab3,cancelTxt;
private View divider1,divider2;
private FragmentContainerView fragmentContainerView;
private FragmentManager fragmentManager;
private FragmentTransaction fragmentTransaction;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_account);
initView();
// 动态加载 Fragment
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();//开启事务
fragmentTransaction.add(R.id.icon_frag,new AddOutFragment());
fragmentTransaction.commit();
}
// 切换 tab页 点击方法
public void tabChange(View view) {
int index = view.getId();
if(index == R.id.tab1){
System.out.println("支出");
divider1.setVisibility(View.INVISIBLE);
divider2.setVisibility(View.VISIBLE);
tab1.setBackgroundResource(R.drawable.selec_tab);
tab3.setBackgroundResource(0);
tab2.setBackgroundResource(0);
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();//开启事务
fragmentTransaction.replace(R.id.icon_frag,new AddOutFragment());
fragmentTransaction.commit();
}else if(index == R.id.tab2){
System.out.println("收入");
divider1.setVisibility(View.INVISIBLE);
divider2.setVisibility(View.INVISIBLE);
tab2.setBackgroundResource(R.drawable.selec_tab);
tab1.setBackgroundResource(0);
tab3.setBackgroundResource(0);
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();//开启事务
fragmentTransaction.replace(R.id.icon_frag,new AddInFragment());
fragmentTransaction.commit();
}else{
System.out.println("转账");
divider1.setVisibility(View.VISIBLE);
divider2.setVisibility(View.INVISIBLE);
tab3.setBackgroundResource(R.drawable.selec_tab);
tab1.setBackgroundResource(0);
tab2.setBackgroundResource(0);
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();//开启事务
fragmentTransaction.replace(R.id.icon_frag,new AddExchangeFragment());
fragmentTransaction.commit();
}
}
}