Android的错误:"犯已经称为QUOT;当删除片段 [英] android error: "commit already called" when remove a fragment

查看:149
本文介绍了Android的错误:"犯已经称为QUOT;当删除片段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想要实现具有片段的活动!当我点击片段1,Fragment2被调用,当我点击Fragment2,Fragment2应该从屏幕上消失!
我通过调用Fragment2的的LinearLayout的setOnclickListener在其onCreateView实现它,和我onclicklistener,我叫

transaction.remove(myFragment);

器transaction.commit();

但在那之后我面对这个错误:提交已经叫
我怎样才能解决这个错误,这里是我的code:
这是我的片段类

 公共类ArticleFragment扩展片段{
最终静态字符串ARG_POSITION =位置;
INT mCurrentPosition = -1;
私有静态的LinearLayout升;
私人android.support.v4.app.FragmentTransaction交易;
私人片段newFragment;公共无效setArticleFragment(android.support.v4.app.FragmentTransaction交易,片段newFragment){
    this.transaction =交易;
    this.newFragment = newFragment;
}@覆盖
公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,
    捆绑savedInstanceState){
    如果(savedInstanceState!= NULL){
        mCurrentPosition = savedInstanceState.getInt(ARG_POSITION);
    }
    视图V = inflater.inflate(R.layout.article_view,集装箱,FALSE);
    L =(的LinearLayout)v.findViewById(R.id.transparentArea);
    如果(L == NULL)
    l.setOnClickListener(新OnClickListener(){        @覆盖
        公共无效的onClick(查看为arg0){
            // TODO自动生成方法存根
            transaction.remove(newFragment);
            器transaction.commit();
        }
    });
    返回伏;
}
}

和我mainAcitivity类

 公共类MainActivity扩展FragmentActivity工具
    HeadlinesFragment.OnHeadlineSelectedListener {HeadlinesFragment firstFragment;@覆盖
公共无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.news_articles);
    如果(findViewById(R.id.fragment_container)!= NULL){
        如果(savedInstanceState!= NULL){
            返回;
        }
        firstFragment =新HeadlinesFragment();
        firstFragment.setArguments(getIntent()getExtras());
        getSupportFragmentManager()调用BeginTransaction()
                。新增(R.id.fragment_container,firstFragment).commit();
    }
}公共无效onArticleSelected(INT位置){
    ArticleFragment articleFrag =(ArticleFragment)getSupportFragmentManager()
            .findFragmentById(R.id.article_fragment);    如果(articleFrag!= NULL){
        articleFrag.updateArticleView(位置);    }其他{
        最后ArticleFragment newFragment =新ArticleFragment();
        捆绑ARGS =新包();
        args.putInt(ArticleFragment.ARG_POSITION,位置);
        newFragment.setArguments(参数);        最后FragmentTransaction交易= getSupportFragmentManager()
                .beginTransaction();
        newFragment.setArticleFragment(事务,newFragment);        transaction.setCustomAnimations(R.anim.slidein,R.anim.slideout);
        transaction.add(R.id.fragment_container,newFragment);
        器transaction.commit();    }
}


解决方案

而不是重用传入的交易中,创建一个新的 FragmentTransaction 实例,消除Fragment2。

更为容易的是添加的第一个片段事务片段回栈(如 addToBackStack(空)),然后在Fragment2,只是弹出与<$ C后退堆栈$ C> FragmentManager popBackStack()

I want to implement an activity that has a fragment! when I click on Fragment1 , Fragment2 is called , and when I click on Fragment2 , Fragment2 should be removed from the screen! I implement it by calling setOnclickListener of LinearLayout of Fragment2 in its onCreateView , and on my onclicklistener , I called

transaction.remove(myFragment);

transaction.commit();

but after that I faced to this error : commit already called how can I fix this error , here is my code: It is my fragment class

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;
}
}

and my mainAcitivity class

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();

    }
}

解决方案

Instead of reusing the passed-in transaction, create a new FragmentTransaction instance that removes Fragment2.

Even easier is to add the first fragment transaction to fragment back stack (e.g. addToBackStack(null)) and then in Fragment2, just pop the back stack with FragmentManager popBackStack().

这篇关于Android的错误:&QUOT;犯已经称为QUOT;当删除片段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆