いくつかのフラグメントで Android アプリを作成しています。スマートフォンでは 1 つのフラグメントのみが表示され、タブレットでは 3 つのフラグメントが表示されます。さまざまなデバイスのレイアウトを次に示します。
タブレットのレイアウト:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mainTopLayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:baselineAligned="false"
android:orientation="horizontal"
android:background="@color/activity_background"
android:tag="@string/layout_tablet_landscape" >
<FrameLayout android:id="@+id/leftContainerLayout"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.33" />
<FrameLayout android:id="@+id/centerContainerLayout"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.33" />
<FrameLayout android:id="@+id/rightContainerLayout"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.33" />
</LinearLayout>
電話のレイアウト:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mainTopLayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/activity_background"
android:tag="@string/layout_phone_portrait" >
<FrameLayout android:id="@+id/mainContainerLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:layout_above="@+id/mainBrewAd" />
<com.google.ads.AdView xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads"
android:id="@+id/mainBrewAd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
ads:adUnitId="##############"
ads:adSize="BANNER"
ads:loadAdOnCreate="true"/>
</RelativeLayout>
メイン アクティビティの OnCreate メソッドでフラグメントをレイアウトに追加するコードを次に示します。
if ((layoutTag == LAND_PHONE) || (layoutTag == PORT_PHONE)) {
GravityFragment gravityFragment = (GravityFragment)fragmentManager.findFragmentById(R.id.mainContainerLayout);
if (gravityFragment == null) {
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.add(R.id.mainContainerLayout, new GravityFragment());
transaction.commit();
}
}
if ((layoutTag == LAND_TABLET) || (layoutTag == PORT_TABLET)) {
GravityFragment gravityFragment = (GravityFragment)fragmentManager.findFragmentById(R.id.leftContainerLayout);
if (gravityFragment == null) {
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.add(R.id.leftContainerLayout, new GravityFragment());
transaction.commit();
}
}
フラグメントの onStart メソッドは次のとおりです。
@Override
public void onStart() {
super.onStart();
//Init a brewcalc object
brewCalc = new BrewCalc(getActivity());
//Assign the click listener
Activity topActivity = getActivity();
Button calcButton = (Button)getActivity().findViewById(R.id.gravityCalculateButton);
calcButton.setOnClickListener(calculateListener);
}
電話で起動すると、すべて正常に動作します。タブレットで起動すると、ヌル ポインター例外が発生します。どうやら、この場合、findViewById は null を返します。どうしてこれなの?