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


136

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

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

アクティビティグループを使用せずに別のプロジェクトとして実行すると、正常に機能します。コントロールがgetview()内に入ると、すべてがlog catで正常に機能しますが、ビューが表示されず、例外も発生しません。本の詳細フラグメントを作成しますセクション詳細フラグメントに置き換えられます。

書籍詳細フラグメントのXMLにはID book_description_fragmentがあり、セクション説明フラグメントのXMLにはID section_description_fragmentがあります。

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

回答:


249

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

8
この場合のR.id.fragment_containerは何ですか?
ガイ

4
@Guy、それはフラグメントをロードしたい任意のレイアウトにすることができます。
スビンセバスチャン2014

1
XMLファイルのフラグメントの名前は何ですか?フラグメントを動的に追加し、静的フラグメントは必要ありません。
Rajat Mehra

1
@RajatMehraフラグメントを動的に追加する場合は、XML内でフラグメントを指定する必要はありません。コンテナービューを使用できます。もう一度答えを読んでください。
Subin Sebastian 2015

4
@Ahmedその理由は、アーキテクチャによって、システムがすべての<fragment>タグを、対応するフラグメントのによって提供されるビュー(グループ)に置き換えるためですonCreateView()。したがって、ご想像のとおり、フラグメントへの参照は実際にはビューレベルで失われます。そのため、基本的にフラグメントを置き換えることはできませんが、コンテナに現在存在するビューを手動で削除し、必要に応じて代わりにフラグメントをそこに置くことができます。
Subin Sebastian 2015

35

この質問をご覧ください

動的に追加されたフラグメント」のみを置き換えることができます。

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


1
こんにちは 。私は解決策を発見しました。実際には、フラグメントのコンテンツをレイアウトに配置するのではなく、前のフラグメントのコンテンツに別のフラグメントを使用していました
Lion Heart

いいえ、ここではフラグメント全体を新しいフラグメントに置き換えることを検討していました。
サナ

1
@ライオンハート、見つけた解決策について詳しく教えてください。
Namratha 2013年

リンクは死んでいます:/
ネオンワージ

8

私はフラグメントの交換ライフサイクルを管理するための完璧な方法で要点を作りました。

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

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

=> ここで要旨を参照

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

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

    super.onBackPressed();
}

1
@RémiPリンクは期待どおりに機能しています。あなたはIMO良いかもしれこの1確認することができますgithub.com/HugoGresse/Anecdote/blob/master/app/src/main/java/io/...
ヒューゴGresse

8

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

4

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

3

私が一緒に仕事を始めたときに私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

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

1

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

((AppCompatActivity) getActivity()).getSupportFragmentManager().beginTransaction().replace(R.id.YourFrameLayout, new YourFragment()).commit();

またはこれを使用できますコード

YourFragment fragments=(YourFragment) getSupportFragmentManager().findFragmentById(R.id.FrameLayout);

        if (fragments==null) {
            getSupportFragmentManager().beginTransaction().replace(R.id.FrameLayout, new Fragment_News()).commit();
        }

0

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

あなたはトランザクションのためにその単純なコードを使うことができます

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

0

フラグメントを1行のコードで動的に変更します。
これは、SDKバージョンとandroidx
で機能します。BottomNavigationView

    BottomNavigationView btn_nav;
    FragmentFirst fragmentFirst;
    FragmentSecond fragmentSecond;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_search);
        fragmentFirst = new FragmentFirst();
        fragmentSecond = new FragmentSecond ();
        changeFragment(fragmentFirst); // at first time load the fragmentFirst
        btn_nav = findViewById(R.id.bottomNav);
        btn_nav.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
                switch(menuItem.getItemId()){
                    case R.id.menu_first_frag:
                        changeFragment(fragmentFirst); // change fragmentFirst
                        break;
                    case R.id.menu_second_frag:
                        changeFragment(fragmentSecond); // change fragmentSecond
                        break;
                        default:
                            Toast.makeText(SearchActivity.this, "Click on wrong bottom SORRY!", Toast.LENGTH_SHORT).show();
                }
                return true;
            }
        });
    }
public void changeFragment(Fragment fragment) {
        getSupportFragmentManager().beginTransaction().replace(R.id.fragment_layout_changer, fragment).commit();
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.