我正在自定义我的应用以在平板电脑上显示2列。我将左右列的宽度设置为setLayoutParams
。它在Android 3.0和Android 3.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);
}
这是我的布局(home.xml),我在其中指定了id的left_column和right_column:
<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>
有谁知道为什么它会在 Android 3.2 上提供nullPointerException
?
编辑:06-03-2013: 正如我在对dymmeh的回答中所说,布尔值isTablet在layouts.xml中设置在文件夹值,values-large和values-xlarge中。 调试到logcat会向我显示它正在if语句中,因此该部分正在运行。 但在此之后我还在2个文件夹中有一个home.xml:layout和layout-land。事实证明,对于Android 3.2,它从布局文件夹而不是layout-land获取home.xml。 我试图在setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE)之后将setContentView(R.layout.home)放在if语句中,但它仍然给出了NPE。 所以我继续搜索为什么setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE)不能用于Android 3.2。
欢迎任何想法。
答案 0 :(得分:0)
发现它!
setRequestedOrientation运行正常,但home.xml并未从layout-land中获取,因为从Android 3.2开始,有一种支持多个屏幕的新方法。然后,您应该使用sw * N * dp,如:DeclaringTabletLayouts
中所述所以我在res:layout-sw600dp中创建了一个新文件夹,并将横向home.xml放在该文件夹中,这就是解决方案。