1. ホーム
  2. アンドロイド

[解決済み】プログラムで作成されたコンテンツビューを持つアクティビティにFragmentを追加する方法

2022-04-04 14:44:03

質問

ActivityにFragmentを追加して、そのレイアウトをプログラムで実装したい。Fragmentのドキュメントに目を通しましたが、私が必要としていることを説明している例はあまりありません。以下は、私が書こうとしたコードのタイプです。

public class DebugExampleTwo extends Activity {

    private ExampleTwoFragment mFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FrameLayout frame = new FrameLayout(this);
        if (savedInstanceState == null) {
            mFragment = new ExampleTwoFragment();
            FragmentTransaction ft = getFragmentManager().beginTransaction();
            ft.add(frame.getId(), mFragment).commit();
        }

        setContentView(frame);
    }
}

...

public class ExampleTwoFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, 
                             ViewGroup container, 
                             Bundle savedInstanceState) {
        Button button = new Button(getActivity());
        button.setText("Hello There");
        return button;
    }
}

このコードはコンパイルされますが、開始時にクラッシュします。 FragmentTransaction.add() が正しくありません。正しい方法は何ですか?

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

このコードには、一つ以上の問題があることがわかりました。フラグメントは、アクティビティと同じjavaファイルの中で、パブリックなインナークラスとしてではなく、そのように宣言することができません。フレームワークは、フラグメントのコンストラクタ(パラメータなし)がパブリックで可視であることを期待します。フラグメントをインナークラスとしてアクティビティに移動するか、フラグメント用に新しいjavaファイルを作成すると解決します。

2つ目の問題は、この方法でフラグメントを追加する場合、フラグメントを含むビューへの参照を渡す必要があり、そのビューはカスタムIDを持つ必要があるということです。デフォルトのidを使用すると、アプリがクラッシュします。以下は、更新されたコードです。

public class DebugExampleTwo extends Activity {

    private static final int CONTENT_VIEW_ID = 10101010;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FrameLayout frame = new FrameLayout(this);
        frame.setId(CONTENT_VIEW_ID);
        setContentView(frame, new LayoutParams(
            LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));

        if (savedInstanceState == null) {
            Fragment newFragment = new DebugExampleTwoFragment();
            FragmentTransaction ft = getFragmentManager().beginTransaction();
            ft.add(CONTENT_VIEW_ID, newFragment).commit();
        }
    }

    public static class DebugExampleTwoFragment extends Fragment {
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            EditText v = new EditText(getActivity());
            v.setText("Hello Fragment!");
            return v;
        }
    }
}