1

タブレットで2列に表示されるようにアプリをカスタマイズしています。左右の列の幅をで設定していますsetLayoutParams。Android3.0およびAndroid3.1エミュレーターで正常に動作しています。Android 3.2エミュレーターでは、を提供しnullPointerExceptionます。

これは私のコードの一部です:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Debug.LogCat(activityName + ":OnCreate");

    setContentView(R.layout.home);

    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);

    // set layout for tablets
    final boolean isTablet = getResources().getBoolean(R.bool.isTablet);
    if (isTablet) {
        // set screenorientation to landscape
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
        // get half screensize
        int width = metrics.heightPixels / 2;
        // set left column to width
        LinearLayout left_column = (LinearLayout) findViewById(R.id.left_column);
        LinearLayout.LayoutParams lp_left_column = new LinearLayout.LayoutParams(width,LinearLayout.LayoutParams.MATCH_PARENT);

        // this is where the NPE occurs
        left_column.setLayoutParams(lp_left_column);

        // set right column to width
        LinearLayout right_column = (LinearLayout) findViewById(R.id.right_column);
        LinearLayout.LayoutParams lp_right_column = new LinearLayout.LayoutParams(width,LinearLayout.LayoutParams.MATCH_PARENT);
        right_column.setLayoutParams(lp_right_column);

    }

これは、IDのleft_columnとright_columnを指定した私のレイアウト(home.xml)です。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:gravity="center" >    


<LinearLayout
    android:id="@+id/left_column"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical" >
    <LinearLayout
        android:id="@+id/ll_gallery"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
        <Gallery
            android:id="@+id/gallery"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            />
    </LinearLayout>
    <LinearLayout
        android:id="@+id/ll_largeImage"
        android:layout_width="match_parent"
        android:layout_height="0dip"
        android:layout_gravity="center"
        android:layout_weight="1" >
        <ImageView 
            android:id="@+id/largeImage"
            android:contentDescription="@string/largeImage"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center"         
            android:onClick="playSound" />
    </LinearLayout>
    <LinearLayout
        android:id="@+id/ll_buttons"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

    </LinearLayout>
</LinearLayout>

<LinearLayout
    android:id="@+id/right_column" 
    android:layout_width="0dip"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@color/white"
    android:visibility="visible"
    android:layout_weight="1" >

    <ImageView 
        android:id="@+id/infoImage"
        android:contentDescription="@string/largeImage"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center" />
</LinearLayout>

なぜそれがAndroid3.2nullPointerExceptionで提供されているのか誰かが知っていますか?

編集:2013年6月3日:dymmehへの回答で述べたように、ブールisTabletはlayouts.xmlのvalues、values-largeおよびvalues-xlargeフォルダーに設定されています。logcatにデバッグすると、ifステートメント内にあることがわかり、その部分は機能しています。しかし、この後、layoutとlayout-landの2つのフォルダーにhome.xmlもあります。Android 3.2の場合、layout-landではなくlayoutフォルダーからhome.xmlを取得していることがわかります。setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE)の後にsetContentView(R.layout.home)をifステートメント内に配置しようとしましたが、それでもNPEが返されます。そのため、Android 3.2でs​​etRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE)が機能しない理由を検索し続けています。

どんなアイデアでも大歓迎です。

4

1 に答える 1

0

それを見つけた!

setRequestedOrientationは正常に機能しましたが、Android 3.2から複数の画面をサポートする新しい方法があるため、home.xmlはlayout-landから取得されませんでした。次に、 DeclaringTabletLayoutsで説明されているようにsw * N*dpを使用する必要があります。

そこで、resに新しいフォルダーlayout-sw600dpを作成し、そのフォルダーにランドスケープhome.xmlを配置しました。これが解決策でした。

于 2013-03-06T21:29:42.910 に答える