如何以编程方式确定我的应用正在使用哪种布局(布局正常,布局大等)?我看到getWindowManager()。getDefaultDisplay()。getMetrics(度量)调用,但它似乎只处理屏幕密度,但不需要应用程序使用哪种布局。我需要的信息,因为我需要在运行时动态地改变一些视图的位置。如何以编程方式确定我的Android应用程序正在使用哪种XML布局?
在此先感谢。
如何以编程方式确定我的应用正在使用哪种布局(布局正常,布局大等)?我看到getWindowManager()。getDefaultDisplay()。getMetrics(度量)调用,但它似乎只处理屏幕密度,但不需要应用程序使用哪种布局。我需要的信息,因为我需要在运行时动态地改变一些视图的位置。如何以编程方式确定我的Android应用程序正在使用哪种XML布局?
在此先感谢。
为什么你不能把什么位置的意见应该在xml中?这种方式时,特定的布局类型被称为你不需要以编程方式做任何事情?
你可以使用不同的文件夹类型,如layout
,layout-sw600dp
,layout-sw720dp
等
看到http://developer.android.com/guide/topics/resources/providing-resources.html进行不同的配置
ViewGroup view = (ViewGroup)getWindow().getDecorView();
LinearLayout content = (LinearLayout)view.getChildAt(0);
int id = content.getId();
的ID告诉你哪个布局你使用(假设你设定的XML中的id标签)。
嗯。我试着用我的RelativeLayout视图:'RelativeLayout content =(RelativeLayout)view.getChildAt(0);'它会导致一个类型转换异常:'java.lang.ClassCastException:android.widget.FrameLayout'。任何想法为什么? – Kenny
我正在寻找相同的东西!我发现2类似questons /回答:
虽然所有三个问题基本上是相同的,你真的需要两个答案让你的结果。
我用这个代码让我的活动里面的布局尺寸:
int layoutSize = getResources().getConfiguration().screenLayout;
layoutSize = layoutSize & Configuration.SCREENLAYOUT_SIZE_MASK;
第一行会返回版面大小,但是这将是一个数字,几乎是int
的最大尺寸。
第二行将与给定掩码的布局大小进行AND。掩码的十进制值为15,或十六进制的F值。
返回值介于0和3之间。对应于屏幕大小的值以及大小掩码的值在android.content.res.Configuration
类中定义为常量:Android Configruation Documentation。
所有你需要的前2行后做的是有某种为SCREENLAYOUT_SIZE_XXX
比较返回layoutSize
与Configuration
的预定义值switch语句。
希望这不是太晚,您可以使用它。我的问题是,我不知道如何用确切的Android语言提问。这可能是为什么同样的问题是,而且可能应该被问到这么多种不同的方式。
一个非常简单的方法来做到这一点,是由ID和标签设置父布局,并在您onCreate()
,可以findViewById()
和getTag()
。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/my_activity_view"
android:tag="big_screen" >
// misc views~
</RelativeLayout>
,然后在你的onCreate
方法,
if(findViewById(R.id.my_activity_view).getTag().equals("big_screen")) {
// do stuff
}
我有同样的问题。如果您使用layout
/layout-sw600dp
/layout-sw720dp
,下不限成员名额工作对我来说:
Configuration config = activity.getResources().getConfiguration();
if (config.smallestScreenWidthDp >= 720) {
// sw720dp code goes here
}
else if (config.smallestScreenWidthDp >= 600) {
// sw600dp code goes here
}
else {
// fall-back code goes here
}
这应该是被接受的答案 – feresr
是的,这应该是有效的答案。 –
下面的代码将帮助你。我只是打印相应的屏幕尺寸或密度类别。你可以做任何你想做的事!
//Determine screen size
if ((getResources().getConfiguration().screenLayout &Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE)
{
Log.d("Screen Size: ", "LARGE");
}
else if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_NORMAL) {
Log.d("Screen Size: ", "NORMAL");
}
else if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_SMALL) {
Log.d("Screen Size: ", "SMALL");
}
else if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_XLARGE) {
Log.d("Screen Size: ", "XLARGE");
}
else {
Log.d("Screen Size: ","UNKNOWN_CATEGORY_SCREEN_SIZE");
}
//Determine density
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int density = metrics.densityDpi;
if (density==DisplayMetrics.DENSITY_HIGH) {
Log.d("Screen Density: ","HIGH");
}
else if (density==DisplayMetrics.DENSITY_MEDIUM) {
Log.d("Screen Density: ","MEDIUM");
}
else if (density==DisplayMetrics.DENSITY_LOW) {
Log.d("Screen Density: ","LOW");
}
else if (density==DisplayMetrics.DENSITY_XHIGH) {
Log.d("Screen Density: ","XHIGH");
}
else if (density==DisplayMetrics.DENSITY_XXHIGH) {
Log.d("Screen Density: ","XXHIGH");
}
else {
Log.d("Screen Density: ","UNKNOWN_CATEGORY");
}
这是一个老问题,但我想和大家分享我的解决这一问题的办法。
创建值 - *变型相匹配的设置,您希望以编程方式确定,在其内部将定义描述当前配置适当的值:
正如你所看到的,布尔值is_landscape都存在在值和值陆,因此,能够经由安全访问该R.bool.is_landscape。
唯一的区别,虽然是值:
getResources().getBoolean(R.bool.is_landscape);
评估为true
在横向模式,并false
否则。
注意:当然,这是可能的,以获得当前设备方向使用getResources().getConfiguration().orientation
,虽然我选择使用这种简单的熟悉的情况下,使我的例子清楚和直截了当的。
理解,这种技术是通用的是很重要的,使用它可以定义更复杂的值的资源的目录,(例如值-ldrtl-sw600dp-V23)支持的更具体配置。
我确实使用了不同的布局文件夹(不能使用swxxxdp,因为我需要保持与2.x兼容),这就是为什么我需要知道应用程序使用哪个布局文件夹。基于用户操作,我有一些视图元素需要在运行时动态显示。 – Kenny
以及如果你使用不同的文件夹,那么你应该没有问题,因为操作系统根据设备选择使用哪种布局。例如,如果用户拥有一台被认为是“大”或VGA的设备,那么它将使用'layout-large'文件夹中的布局。你只需要确保每个文件夹中的文件都是相同的。我知道你不需要做所有这些额外的东西,你认为你做了 – tyczj
了解。但是我的观点并不是XML的一部分,需要根据所选的屏幕大小/布局在运行时略有不同,这就是为什么我需要知道哪一个被使用,以便我可以调整和添加视图因此。我已经将“基准”XML命名为相同,但在每个layout-xyz文件夹中实现方式略有不同。 – Kenny