【问题标题】:android error: "commit already called" when remove a fragmentandroid错误:删除片段时“提交已调用”
【发布时间】:2013-09-09 11:44:06
【问题描述】:

我想实现一个有片段的活动!当我点击 Fragment1 时, Fragment2 被调用,当我点击 Fragment2 时, Fragment2 应该从屏幕上删除! 我通过在其 onCreateView 中调用 Fragment2 的 LinearLayout 的 setOnclickListener 来实现它,在我的 onclicklistener 上,我调用了

transaction.remove(myFragment);

transaction.commit();

但在那之后我遇到了这个错误:提交已经调用 我该如何解决这个错误,这是我的代码: 这是我的片段类

public class ArticleFragment extends Fragment {
final static String ARG_POSITION = "position";
int mCurrentPosition = -1;
private static LinearLayout l;
private android.support.v4.app.FragmentTransaction transaction;
private Fragment newFragment;

public void setArticleFragment(android.support.v4.app.FragmentTransaction transaction , Fragment newFragment) {
    this.transaction = transaction;
    this.newFragment = newFragment;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState) {
    if (savedInstanceState != null) {
        mCurrentPosition = savedInstanceState.getInt(ARG_POSITION);
    }
    View v = inflater.inflate(R.layout.article_view, container , false);
    l = (LinearLayout) v.findViewById(R.id.transparentArea);
    if(l == null)
    l.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            transaction.remove(newFragment);
            transaction.commit();
        }
    });
    return v;
}
}

还有我的 mainAcitivity 类

public class MainActivity extends FragmentActivity implements
    HeadlinesFragment.OnHeadlineSelectedListener{

HeadlinesFragment firstFragment;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.news_articles);
    if (findViewById(R.id.fragment_container) != null) {
        if (savedInstanceState != null) {
            return;
        }
        firstFragment = new HeadlinesFragment();
        firstFragment.setArguments(getIntent().getExtras());
        getSupportFragmentManager().beginTransaction()
                .add(R.id.fragment_container, firstFragment).commit();
    }
}

public void onArticleSelected(int position) {
    ArticleFragment articleFrag = (ArticleFragment) getSupportFragmentManager()
            .findFragmentById(R.id.article_fragment);

    if (articleFrag != null) {
        articleFrag.updateArticleView(position);

    } else {
        final ArticleFragment newFragment = new ArticleFragment();
        Bundle args = new Bundle();
        args.putInt(ArticleFragment.ARG_POSITION, position);
        newFragment.setArguments(args);

        final FragmentTransaction transaction = getSupportFragmentManager()
                .beginTransaction();
        newFragment.setArticleFragment(transaction, newFragment);

        transaction.setCustomAnimations(R.anim.slidein, R.anim.slideout);
        transaction.add(R.id.fragment_container, newFragment);
        transaction.commit();

    }
}

【问题讨论】:

    标签: android android-fragments android-activity


    【解决方案1】:

    不要重复使用传入的事务,而是创建一个新的FragmentTransaction 实例来删除 Fragment2。

    更简单的方法是将第一个片段事务添加到片段返回堆栈(例如addToBackStack(null)),然后在 Fragment2 中,只需使用FragmentManagerpopBackStack() 弹出返回堆栈。

    【讨论】:

    【解决方案2】:

    开始新的交易

    fragTran = fragMan.beginTransaction();
    fragTran.replace(R.id.frag_cont_two, fThree);
    fragTran.addToBackStack(null);
    fragTran.commit();
    

    【讨论】:

    • 当我有很多按钮可以打开不同的片段时,您的代码不起作用
    • 你必须用不同的条件替换不同的片段。请阅读片段的概念
    • 我也有一个问题@AnandSavjani,当我点​​击其他按钮时,它总是崩溃应用程序并在提交中生成异常已被调用
    • 每次点击按钮时添加fragTran = fragMan.beginTransaction();
    • 这不起作用,当我点击另一个按钮时,以前的数据不干净,新数据来自以前的数据
    【解决方案3】:

    我解决了这个问题 在调用 commit() 并再次替换您应该从

    开始的片段之后
    fragmentTransaction = fragmentManager.beginTransaction();
    

    【讨论】:

    • 添加fragmentTransaction .addToBackStack(null);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-17
    • 2020-06-21
    • 2017-03-19
    • 2014-08-25
    • 1970-01-01
    • 2012-01-14
    相关资源
    最近更新 更多