AlertDialog.Builder.setView()将在Lollipop上加载错误的资源

时间:2015-06-08 05:07:56

标签: android android-layout android-alertdialog android-support-library android-resources

我正在为不同的API平台创建不同的对话框布局,通过为Android HoneyComb之后的平台指定res / layout-v11,并且早期设备应从默认的res / layout目录加载。但是,在我更新target-api和支持库之后,这种机制似乎被打破了。最终的APK可以在我的NexusS上使用Android 4.1正常工作,但会在我的Nexsu5和Nexus7上加载默认布局,两者都使用Android 5.1.1。

这是一个奇怪的问题,因为与layout-vX区分的活动布局仍然有效,只有对话框布局错误。

示例代码:

MainActivity.java :(我试过android.app.AlertDialog和android.support.v7.app.AlertDialog,行为是一样的)

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.app.AlertDialog;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        View dialogView = View.inflate(this, R.layout.alert, null);
        builder.setView(dialogView);
        builder.show();
    }
}

RES /布局/ alert.xml

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_margin="2.0dip"
    android:background="@android:color/white">

    <TextView
        android:id="@+id/web_site_add_terms_contents"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:padding="16dp"
        android:textStyle="bold"
        android:text="alert box from res/layout"
        android:color="@android:color/black" />
    <CheckBox 
        android:id="@+id/web_site_add_terms_agree"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_marginLeft="16dp"
        android:layout_below="@id/web_site_add_terms_contents"
        android:text="check box"
        android:color="@android:color/black" />

</RelativeLayout>

RES /布局-V11 / alert.xml

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_margin="2.0dip">

    <TextView
        android:id="@+id/web_site_add_terms_contents"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:padding="16dp"
        android:textStyle="bold"
        android:text="alert box from res/layout-v11" />
    <CheckBox 
        android:id="@+id/web_site_add_terms_agree"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_marginLeft="16dp"
        android:layout_below="@id/web_site_add_terms_contents"
        android:text="check box v11" />

</RelativeLayout>

在NexusS(4.1.2),Nexus5(5.1.1)和Nexus7(5.1.1)上简单构建并启动应用程序,结果如下:

  1. NexusS:对话框显示&#39; v11&#39;文本
  2. Nexus5:显示默认文字的对话框
  3. Nexus7:显示默认文字的对话框
  4. 任何帮助或提示都将受到赞赏。

    更新

    我在res / layout-v21 / alert.xml中添加了另一个资源文件夹,它适用于我的Lollipop设备!任何人都可以解释这个伎俩吗?

    RES /布局-V21 / alert.xml

    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_margin="2.0dip">
    
        <TextView
            android:id="@+id/web_site_add_terms_contents"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:padding="16dp"
            android:textStyle="bold"
            android:text="alert box from res/layout-v21" />
        <CheckBox 
            android:id="@+id/web_site_add_terms_agree"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentStart="true"
            android:layout_alignParentLeft="true"
            android:layout_marginLeft="16dp"
            android:layout_below="@id/web_site_add_terms_contents"
            android:text="check box v21" />
    
    </RelativeLayout>
    

    我构建了这个应用程序,它显示了&#39; v11&#39;在我的NexusS和&#39; v21&#39;在我的Nexus5和Nexus7上。我现在很困惑。

1 个答案:

答案 0 :(得分:0)

您可以指定布局适用的版本,方法是将它们放在layout-vxx中,xx是平台版本。例如,layout-v21将适用于Android 5.0及更高版本,因此您的Nexus 5(5.1.1,API版本22)将使用此文件夹中的布局。您的Nexus S是Android版本4.1.2(API级别16),因此它将使用layout-v11中的布局。 Google文档中的更多细节: http://developer.android.com/guide/topics/resources/providing-resources.html