1

いくつかのフラグメントで 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 を返します。どうしてこれなの?

4

2 に答える 2

0

コードを Fragment の OnCreateView() メソッドに入れるだけです。

次の例を参照してください

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    {
        activityContext = getActivity();
        View parentView = inflater.inflate(R.layout.sync_fargment,container,false);

        ImageView abc= (ImageView) parentView.findViewById(R.id.abc);
        ImageView xyz= (ImageView) parentView.findViewById(R.id.xyz);

    }
于 2013-08-01T10:33:54.260 に答える