258

プログラムでレイアウトを実装するアクティビティにフラグメントを追加したいと思います。フラグメントのドキュメントを調べましたが、必要なものを説明する例は多くありません。これが私が書き込もうとしたコードのタイプです:

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

このコードはコンパイルされますが、おそらくmyFragmentTransaction.add()が正しくないため、起動時にクラッシュします。これを行う正しい方法は何ですか?

4

8 に答える 8

206

そのコードには複数の問題があることがわかりました。フラグメントは、アクティビティと同じ Java ファイル内では宣言できますが、public 内部クラスとして宣言することはできません。フレームワークは、フラグメントのコンストラクター (パラメーターなし) がパブリックで可視であることを想定しています。フラグメントを内部クラスとしてアクティビティに移動するか、フラグメント用の新しい 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;
        }
    }
}
于 2011-03-01T22:22:51.100 に答える
37
    public class Example1 extends FragmentActivity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
          DemoFragment fragmentDemo = (DemoFragment) 
          getSupportFragmentManager().findFragmentById(R.id.frame_container);
          //above part is to determine which fragment is in your frame_container
          setFragment(fragmentDemo);
                       (OR)
          setFragment(new TestFragment1());
        }

        // This could be moved into an abstract BaseActivity 
        // class for being re-used by several instances
        protected void setFragment(Fragment fragment) {
            FragmentManager fragmentManager = getSupportFragmentManager();
            FragmentTransaction fragmentTransaction = 
                fragmentManager.beginTransaction();
            fragmentTransaction.replace(android.R.id.content, fragment);
            fragmentTransaction.commit();
        }
    }

フラグメントをアクティビティまたは FramentActivity に追加するには、コンテナが必要です。そのコンテナーは " Framelayout" である必要があります。これは xml に含めることができます。または、" android.R.id.content" のような既定のコンテナーを使用して、アクティビティ内のフラグメントを削除または置換することもできます。

main.xml

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
 <!-- Framelayout to display Fragments -->
   <FrameLayout
        android:id="@+id/frame_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <ImageView
        android:id="@+id/imagenext"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_margin="16dp"
        android:src="@drawable/next" />
</RelativeLayout>
于 2015-01-29T06:22:44.790 に答える
6

API レベル 17以上では、このView.generateViewId()問題は解決されます。ユーティリティ メソッドは、ビルド時に使用されない一意の ID を提供します。

于 2015-09-07T15:32:57.337 に答える