如何以编程方式确定我的应用当前使用的布局(布局正常,布局大等)?我看到了getWindowManager()。getDefaultDisplay()。getMetrics(metrics)调用,但它似乎只处理屏幕密度,但不一定是应用程序使用的布局。我需要这些信息,因为我需要以编程方式在运行时动态地更改视图的某些位置。
提前致谢。
答案 0 :(得分:32)
一种非常简单的方法是将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
}
答案 1 :(得分:20)
我遇到了同样的问题。如果您使用的是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
}
答案 2 :(得分:3)
以下代码可以帮助您。我刚刚打印出相应的屏幕尺寸或密度类别。你可以做任何你想做的事情!
//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");
}
答案 3 :(得分:2)
我正在寻找同样的事情!我发现了2个类似的问题/答案:
虽然所有三个问题基本相同,但您确实需要两个答案来获得结果。
我使用此代码来获取Activity中的布局大小:
int layoutSize = getResources().getConfiguration().screenLayout;
layoutSize = layoutSize & Configuration.SCREENLAYOUT_SIZE_MASK;
第一行将返回布局大小,但它将是一个几乎是int
的最大大小的数字。
第二行将使用给定的掩码与布局大小进行AND。掩码的十进制值为15,十六进制为F.
返回的值介于0和3之间。与屏幕大小相对应的值以及大小掩码的值在android.content.res.Configuration
类中定义为常量:Android Configruation Documentation。
在前两行之后你需要做的就是使用某种switch语句来比较返回的layoutSize
和Configuration
SCREENLAYOUT_SIZE_XXX
的预定义值。< / p>
希望你使用它还为时不晚。我的问题是我不知道如何用精确的Android语言提问。这可能就是为什么同样的问题,也许应该是,问了很多不同的方式。
答案 4 :(得分:1)
这是一个老问题,但我想分享一下解决这个问题的方法。
创建一个 values - * 变体,匹配您希望以编程方式确认的每个设置,在其中您将定义描述当前配置的正确值:
如您所见,布局值 is_landscape 同时存在于值和 values-land 中,因此可以安全地访问它通过 R.bool.is_landscape 。
唯一的区别是价值:
getResources().getBoolean(R.bool.is_landscape);
在横向模式下评估为true
,否则评估为false
。
注意:当然可以使用getResources().getConfiguration().orientation
来获取当前的设备方向,但我选择使用这个简单熟悉的案例来使我的示例清晰直观前进。
重要的是要理解这种技术是通用的,使用它可以定义更复杂的值资源目录(例如 values-ldrtl-sw600dp-v23 )以支持更具体的配置。
答案 5 :(得分:0)
为什么你不能把视图的位置放在xml中?那种方式当调用特定的布局类型时你不需要以编程方式做任何事情吗?
您可以使用不同的文件夹类型,例如layout
,layout-sw600dp
,layout-sw720dp
等
请参阅http://developer.android.com/guide/topics/resources/providing-resources.html了解不同的配置
答案 6 :(得分:0)
ViewGroup view = (ViewGroup)getWindow().getDecorView();
LinearLayout content = (LinearLayout)view.getChildAt(0);
int id = content.getId();
id告诉您正在使用哪个布局(假设您在XML中设置了id标记)。