我正在为不同的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)上简单构建并启动应用程序,结果如下:
任何帮助或提示都将受到赞赏。
更新
我在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上。我现在很困惑。
答案 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