1. ホーム
  2. android

[解決済み] フラグメント・イン・フラグメント

2022-04-27 09:39:37

質問

フラグメントの内部での作業についてヘルプが必要です。 戻るボタンを押したときの問題に直面しています。アプリケーションのメイン画面 ボタンがあり、各ボタンを押すと新しいボタンに置き換わります。 フラグメント(そしてそのフラグメントは別のフラグメントの中に含まれています。) 動的にフラグメントを追加/置換することは問題なく動作しています。 button1 フラグメントが置き換えられ、ボタンを押しても同じことが起こりますが、もし もう一度ボタンを押すと、例外が発生しました。

"Duplicate id 0x7f05000a, tag null, or parent id 0x7f050009 with
another fragment for com........ fragmentname"

は、フラグメントまたはインナーフラグメントがすでに追加されており、私が試行していることを意味します。 の中にあるフラグメントを操作する方法をご存知の方はいらっしゃいますか? を、問題なく行ったり来たりすることができます。 をサポートします。

フラグメントが動的に追加されるMainActivity。 を置き換えます。

public class FragmentInsideFragmentTestActivity extends Activity {

    private Button button1;
    private Button button2;
    private Button button3;
    private Button button4;


    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        button1 =(Button) this.findViewById(R.id.button1);
        button1.setOnClickListener(new View.OnClickListener() {
           public void onClick(View view) {
               onButtonClick(view);
            }
        });

        button2 =(Button) this.findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                onButtonClick(view);
            }
        });

        button3 =(Button) this.findViewById(R.id.button3);
        button3.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
               onButtonClick(view);
            }
        });

        button4 =(Button) this.findViewById(R.id.button4);
        button4.setOnClickListener(new View.OnClickListener() {
           public void onClick(View view) {
               onButtonClick(view);
           }
        });
    }

    public void onButtonClick(View v) {
        Fragment fg;

        switch (v.getId()) {
           case R.id.button1:
                   fg=FirstFragment.newInstance();
                   replaceFragment(fg);
                   break;
           case R.id.button2:
                   fg=SecondFragment.newInstance();
                   replaceFragment(fg);
                   break;
           case R.id.button3:
                   fg=FirstFragment.newInstance();
                   replaceFragment(fg);
                   break;
           case R.id.button4:
                   fg=SecondFragment.newInstance();
                   replaceFragment(fg);
                   break;
        }
    }

    private void replaceFragment(Fragment newFragment) {
       FragmentTransaction trasection = getFragmentManager().beginTransaction();

        if(!newFragment.isAdded()) {
            try {
                //FragmentTransaction trasection =
                getFragmentManager().beginTransaction();
                trasection.replace(R.id.linearLayout2, newFragment);
                trasection.addToBackStack(null);
                trasection.commit();
            } catch (Exception e) {
                // TODO: handle exception
                // AppConstants.printLog(e.getMessage());
            } else {
                trasection.show(newFragment);
            }
        }
    }

以下はレイアウトです:main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">

    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Button1" />

        <Button
            android:id="@+id/button2"
            android:text="Button2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <Button
            android:id="@+id/button3"
            android:text="Button3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <Button
            android:id="@+id/button4"
            android:text="Button4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/linearLayout2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" />
</LinearLayout>

私の問題がクリアになることを願っています。

どのように解決するのですか?

AFAIKでは、フラグメントは他のフラグメントを保持することはできません。


アップデイト

現在のバージョンの Android サポートパッケージ、または API Level 17 以降のネイティブフラグメントでは、以下の方法でフラグメントをネストすることができます。 getChildFragmentManager() . これは、API レベル 11-16 のフラグメントの Android サポートパッケージ版を使用する必要があることを意味します。なぜなら、これらのデバイスにはネイティブ版のフラグメントが存在しますが、そのバージョンには getChildFragmentManager() .