2

フラグメントを持つアクティビティを実装したい!Fragment1 をクリックすると Fragment2 が呼び出され、 Fragment2 をクリックすると Fragment2 が画面から削除されます。onCreateView で Fragment2 の LinearLayout の setOnclickListener を呼び出して実装し、 onclicklistener で呼び出しました

transaction.remove(myFragment);

transaction.commit();

しかし、その後、私はこのエラーに直面しました: commit already called このエラーを修正するにはどうすればよいですか? ここに私のコードがあります: 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;
}
}

そして私のmainActivityクラス

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

    }
}
4

3 に答える 3

11

FragmentTransaction渡されたトランザクションを再利用する代わりに、 Fragment2 を削除する新しいインスタンスを作成します。

さらに簡単なのは、最初のフラグメント トランザクションをフラグメント バック スタック (例: addToBackStack(null)) に追加し、次に Fragment2 で を使用してバック スタックをポップすることFragmentManager popBackStack()です。

于 2013-09-09T11:54:54.053 に答える
2

新しい取引を開始する

fragTran = fragMan.beginTransaction();
fragTran.replace(R.id.frag_cont_two, fThree);
fragTran.addToBackStack(null);
fragTran.commit();
于 2015-08-01T13:56:04.130 に答える
0

commit()開始する必要があるフラグメントを呼び出して再度置き換えた後、問題を解決しました

fragmentTransaction = fragmentManager.beginTransaction();
于 2016-03-19T15:24:00.683 に答える