web-dev-qa-db-ja.com

アクティビティグループ内のフラグメントを別のフラグメントに置き換える

グループアクティビティ内にフラグメントがあり、それを別のフラグメントに置き換えたい:

FragmentTransaction ft = getActivity().getFragmentManager().beginTransaction();
SectionDescriptionFragment bdf = new SectionDescriptionFragment();
ft.replace(R.id.book_description_fragment, bdf);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack(null);
ft.commit();

アクティビティグループを使用せずに別のプロジェクトとして実行すると問題なく動作します。getcat()内で制御が行われるため、すべてがlog catで正常に動作しますが、ビューは表示されず、例外も発生しません。セクション詳細フラグメントに置き換えられます。

本の詳細フラグメントのXMLのIDはbook_description_fragmentで、セクションの説明フラグメントのxmlのIDはsection_description_fragmentです。

上記のコードはアイテムのonClickメソッドにあります。ユーザーが水平スクロールビューでアイテムをタップすると、フラグメントが変更されます。

129
Lion Heart

XMLでハードコーディングされたフラグメントは置換できません。フラグメントを別のフラグメントに置換する必要がある場合、まず動的に追加する必要があります。

注:R.id.fragment_containerは、フラグメントを持ち込むアクティビティで選択したレイアウトまたはコンテナです。

// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack if needed
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);

// Commit the transaction
transaction.commit();
241
Subin Sebastian

こちらをご覧ください 質問

置換できるのは、「動的に追加されたフラグメント」のみです。

したがって、動的フラグメントを追加する場合は、 this の例を参照してください。

34
Sana

私はTHE完璧な方法を使ってGistを作成しましたfragmentreplacementおよびlifecycle

同じでなく、バ​​ックスタックにない場合(この場合はポップします)、現在のフラグメントを新しいフラグメントに置き換えます。

フラグメントをバックスタックに保存するかのように、いくつかのオプションが含まれています。

=> ここの要点を参照

これと単一のアクティビティを使用して、アクティビティにこれを追加できます。

@Override
public void onBackPressed() {
    int fragments = getSupportFragmentManager().getBackStackEntryCount();
    if (fragments == 1) {
            finish();
            return;
    }

    super.onBackPressed();
}
8
Hugo Gresse

Android.support.v4で以下のコードを使用します

FragmentTransaction ft1 = getFragmentManager().beginTransaction();
WebViewFragment w1 = new WebViewFragment();
w1.init(linkData.getLink());
ft1.addToBackStack(linkData.getName());
ft1.replace(R.id.listFragment, w1);
ft1.commit();
8
Sachin Suthar

V4を使用してこのコードを使用します

 ExampleFragment newFragment = new ExampleFragment();     
 FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();  
 // Replace whatever is in the fragment_container view with this fragment,  
 // and add the transaction to the back stack so the user can navigate back   
 transaction.replace(R.id.container, newFragment);
 transaction.addToBackStack(null);  
 // Commit the transaction   
 transaction.commit();
4
Manish Butola

Android Fragmentsで作業を始めたときも同じ問題を抱えていたので、「1-フラグメントを他のフラグメントに切り替える方法」について読みました。 2- Fragment containerにフラグメントがない場合にフラグメントを追加する方法。

その後、いくつかのR&Dの後、これまで多くのプロジェクトで役立つ機能を作成しましたが、今でもこの単純な機能を使用しています。

public void switchFragment(BaseFragment baseFragment) {
    try {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.setCustomAnimations(Android.R.anim.slide_in_left, Android.R.anim.slide_out_right);
        if (getSupportFragmentManager().findFragmentById(R.id.home_frame) == null) {
            ft.add(R.id.home_frame, baseFragment);
        } else {
            ft.replace(R.id.home_frame, baseFragment);
        }
        ft.addToBackStack(null);
        ft.commit();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

コード時間をお楽しみください:)

3
John smith

ViewPagerを使用します。それは私の仕事です。

final ViewPager viewPager = (ViewPager) getActivity().findViewById(R.id.vp_pager); 
button = (Button)result.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        viewPager.setCurrentItem(1);
    }
});
3
Nikolay

Kotlinでは次のことができます。

// instantiate the new fragment
val fragment: Fragment = ExampleFragment()

val transaction = supportFragmentManager.beginTransaction()
transaction.replace(R.id.book_description_fragment, fragment)
transaction.addToBackStack("transaction_name")
// Commit the transaction
transaction.commit()
0
Nicola Gallazzi

シンプルなコードを使用してトランザクションに対応できます

Fragment newFragment = new MainCategoryFragment();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame_NavButtom, newFragment);
ft.commit(); 
0
user8427383

このコードを使用できます

((AppCompatActivity) getActivity()).getSupportFragmentManager().replace(R.id.YourFrameLayout, new YourFragment()).commit();
0
Diako Hasani