建议使用resource qualifiers,但有办法在代码中实现。
您可以将所有布局放在同一个文件夹中(例如文件夹layout),并带有适当的前缀:
- activity_main_base.xml
- activity_main_svga.xml
- activity_main_sw320dp.xml
- (其他布局……)
然后在onCreate,你只需要得到你想要的:
setContentView(R.layout.activity_main_sw320dp));
现在,如果您需要根据屏幕指标选择布局……
screen size:
int screenLayout = context.getResources().getConfiguration().screenLayout
&= Configuration.SCREENLAYOUT_SIZE_MASK;
switch (screenLayout) {
case Configuration.SCREENLAYOUT_SIZE_SMALL:
// small
break;
case Configuration.SCREENLAYOUT_SIZE_NORMAL:
// normal
break;
case Configuration.SCREENLAYOUT_SIZE_LARGE:
// large
break;
case Configuration.SCREENLAYOUT_SIZE_XLARGE:
// xlarge
break;
default:
// undefined
break;
}
screen density:
int density = context.getResources().getDisplayMetrics().densityDpi;
switch (density) {
case DisplayMetrics.DENSITY_LOW:
// low ldpi
break;
case DisplayMetrics.SCREENLAYOUT_SIZE_NORMAL:
// medium mdpi
break;
case DisplayMetrics.SCREENLAYOUT_SIZE_LARGE:
// high hdpi
break;
case …:
// other densities (xhdpi, xxhdpi,…)
break;
default:
// undefined
break;
}
您可以使用其他一些,如屏幕宽度或高度,并根据需要组合它们。
编辑:
直接使用资源文件不可能。以下是研究:
想法是尝试从资源路径手动获取文件,然后使用XmlPullParser 来膨胀布局。
-
获取uri of the resource file:
String uriPath = "android.resource://" + getPackageName() + "/layout-sw320dp/main_activity";
Uri uri = Uri.parse(uriPath);
-
Setup the XmlPullParser 对象并将 uri 传递给它:
XmlPullParser parser = Xml.newPullParser();
try {
InputStream in = getContentResolver().openInputStream(uri);
parser.setInput(in, "UTF-8");
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
parser.setFeature(XmlPullParser.FEATURE_VALIDATION, true);
parser.setFeature(XmlPullParser.FEATURE_REPORT_NAMESPACE_ATTRIBUTES, true);
} catch (Exception e) {
}
View layout = LayoutInflater.from(this).inflate(parser, null);
-
最后将布局设置为内容视图:
setContentView(layout);
但是运行这段代码会抛出一个InflateException:
InflateException: Unexpected token (position:TEXT ������������P����...@3:312 in java.io.InputStreamReader@4009b5d)
这是因为资源文件夹中的 xml 文件(drawable、layout 等 raw 是例外)are encoded 在编译应用程序时(使用 Assets 文件夹 should work)
所以恐怕没有办法做到这一点。