Android 更改片段时提交已调用的错误

Android 更改片段时提交已调用的错误,android,android-fragments,fragmenttransaction,fragmentmanager,Android,Android Fragments,Fragmenttransaction,Fragmentmanager,我最近在授予访问外部存储的权限(Android M)时遇到了错误“onSaveInstanceState之后无法执行此操作”。 我根据帖子(我想)解决了这个问题 现在我遇到了一个新的问题,当我试图更改一个片段时,出现了错误“commit ready called” 只要我想切换到某个片段(例如Discussionfragment),我就会得到错误“commit ready called”,请参阅logcat 我已经在stackoverflow上寻找了一些解决方案,但我似乎没有发现问题所在,我知道

我最近在授予访问外部存储的权限(Android M)时遇到了错误“onSaveInstanceState之后无法执行此操作”。 我根据帖子(我想)解决了这个问题

现在我遇到了一个新的问题,当我试图更改一个片段时,出现了错误“commit ready called”

只要我想切换到某个片段(例如Discussionfragment),我就会得到错误“commit ready called”,请参阅logcat

我已经在stackoverflow上寻找了一些解决方案,但我似乎没有发现问题所在,我知道有很多问题需要解决,但在我的情况下如何处理呢? 有人能帮我吗

调用Discussionfragment:

public class DiscussionsActivity extends BaseActivity
{
..
  discussionsFragment = DiscussionsFragment.getInstance(id);
  changeContent(discussionsFragment, R.id.content, false); <---
..
}
公共类讨论活动扩展了BaseActivity
{
..
discussionsFragment=discussionsFragment.getInstance(id);

changeContent(discussionsFragment,R.id.content,false);删除全局FragmentTransaction并在本地声明它

public void changeContent(Fragment fragment, int content, boolean inBackStack) {
        InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
        try {
            inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
        } catch (Exception e) {
        }
        fragmentManager = getSupportFragmentManager();
        String newTag = ((Object) fragment).getClass().getName() + ":" + fragmentManager.getBackStackEntryCount();

        FragmentTransaction  transaction = fragmentManager.beginTransaction().replace(content, fragment, newTag);

        transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
        if (inBackStack) {
            transaction.addToBackStack(fragment.getClass().getSimpleName());
        } else
            mReturningWithResult = true; <--- handle onSaveInstanceState error in onResume
            try {
                transaction.commit();
            } catch (IllegalStateException ignored) {
                // There's no way to avoid getting this if saveInstanceState has already been called.
            }

        currentFragment = fragment;
    }
public void changeContent(片段片段、int内容、布尔inBackStack){
InputMethodManager InputMethodManager=(InputMethodManager)getSystemService(Activity.INPUT\u方法\u服务);
试一试{
inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),0);
}捕获(例外e){
}
fragmentManager=getSupportFragmentManager();
字符串newTag=((对象)fragment.getClass().getName()+“:”+fragmentManager.GetBackBackbackEntryCount();
FragmentTransaction=fragmentManager.beginTransaction().replace(内容、片段、新标记);
transaction.setTransition(FragmentTransaction.transition\u FRAGMENT\u OPEN);
if(内备份堆栈){
transaction.addToBackStack(fragment.getClass().getSimpleName());
}否则

mReturningWithResult=true;在commit语句之后,您可以尝试使用相同的片段事务提交两次。如果以前的事务已经提交,请创建一个新的片段事务

还建议确保
commit()
使用调试点

public void changeContent(Fragment fragment, int content, boolean inBackStack) {
 ...........
 ...........
     try {
         fragmentManager.popBackStackImmediate();
         transaction.commit();
       } catch (IllegalStateException ignored) {
       // There's no way to avoid getting this if saveInstanceState has already been called.

 ...........
 ...........


      }


@Override
 public void onResume() {
     super.onResume();
      ...........
      ...........
       //This method would be called at second time.

       transaction.commit(); <---- HERE THE CRASH HAPPENS

        // Reset the boolean flag back to false for next time.
        mReturningWithResult = false;
      ...........
      ...........
    }
public void changeContent(片段片段、int内容、布尔inBackStack){
...........
...........
试一试{
fragmentManager.popbackbackimmediate();
commit();
}捕获(IllegalStateException被忽略){
//如果已调用saveInstanceState,则无法避免出现这种情况。
...........
...........
}
@凌驾
恢复时公开作废(){
super.onResume();
...........
...........
//此方法将在第二次调用。

transaction.commit();每次您打算执行任何数量的碎片操作时,都需要开始一个新的碎片事务。但这就是我在changeContent中所做的。请您根据我的代码提供一个示例,它应该是什么?Thx Nas但问题在于onResume,其中包含什么?因为现在根本没有显示MainActivity。
public void changeContent(Fragment fragment, int content, boolean inBackStack) {
        InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
        try {
            inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
        } catch (Exception e) {
        }
        fragmentManager = getSupportFragmentManager();
        String newTag = ((Object) fragment).getClass().getName() + ":" + fragmentManager.getBackStackEntryCount();

        FragmentTransaction  transaction = fragmentManager.beginTransaction().replace(content, fragment, newTag);

        transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
        if (inBackStack) {
            transaction.addToBackStack(fragment.getClass().getSimpleName());
        } else
            mReturningWithResult = true; <--- handle onSaveInstanceState error in onResume
            try {
                transaction.commit();
            } catch (IllegalStateException ignored) {
                // There's no way to avoid getting this if saveInstanceState has already been called.
            }

        currentFragment = fragment;
    }
public void changeContent(Fragment fragment, int content, boolean inBackStack) {
 ...........
 ...........
     try {
         fragmentManager.popBackStackImmediate();
         transaction.commit();
       } catch (IllegalStateException ignored) {
       // There's no way to avoid getting this if saveInstanceState has already been called.

 ...........
 ...........


      }


@Override
 public void onResume() {
     super.onResume();
      ...........
      ...........
       //This method would be called at second time.

       transaction.commit(); <---- HERE THE CRASH HAPPENS

        // Reset the boolean flag back to false for next time.
        mReturningWithResult = false;
      ...........
      ...........
    }