10

如何以编程方式确定我的应用当前使用的布局(布局正常、布局大等)?我看到了 getWindowManager().getDefaultDisplay().getMetrics(metrics) 调用,但它似乎只处理屏幕密度,而不是应用程序使用的布局。我需要这些信息,因为我需要在运行时以编程方式动态更改视图的一些定位。

提前致谢。

4

6 回答 6

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
}
于 2013-02-08T03:30:34.767 回答
22

我有同样的问题。如果您正在使用layout// layout-sw600dplayout-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
}
于 2013-12-17T20:11:18.140 回答
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");
        }
于 2014-01-30T04:44:42.287 回答
2

我正在寻找同样的东西!我发现了 2 个类似的问题/答案:

获取 ScreenLayout

使用 ScreenLayout 位掩码

虽然这三个问题本质上是相同的,但您确实需要两个答案才能得到结果。

我使用这段代码来获取我的 Activity 中的布局大小:

int layoutSize = getResources().getConfiguration().screenLayout;
layoutSize = layoutSize & Configuration.SCREENLAYOUT_SIZE_MASK;

第一行将返回布局大小,但它将是一个几乎是int.

第二行将与给定掩码的布局大小。掩码的十进制值为 15,或十六进制值为 F。

返回的值介于 0 和 3 之间。屏幕尺寸对应的值以及尺寸掩码的值在android.content.res.Configuration类中定义为常量:Android Configruation Documentation

在前两行之后,您需要做的就是使用某种 switch 语句将返回的值layoutSizeConfiguration的预定义值进行比较SCREENLAYOUT_SIZE_XXX

希望您使用它还为时不晚。我的问题是我不知道如何用确切的 Android 语言提问。这可能就是为什么同一个问题被问到而且可能应该被问到这么多不同的方式。

于 2012-07-26T14:41:46.173 回答
1

这是一个老问题,但我想分享我解决这个问题的方法。

创建一个与您希望以编程方式确认的每个设置匹配的values-*变体,您将在其中定义描述当前配置的正确值:

在此处输入图像描述

如您所见,布尔值is_landscape同时存在于valuesvalues-land中,因此可以通过R.bool.is_landscape安全地访问它。

但是,唯一的区别是值:

getResources().getBoolean(R.bool.is_landscape);在横向模式下评估为truefalse否则。

注意:当然可以使用它getResources().getConfiguration().orientation来获取当前的设备方向,尽管我选择使用这个简单熟悉的案例来使我的示例清晰明了。

重要的是要了解这种技术是通用的,使用它可以定义更复杂的值资源目录(例如values-ldrtl-sw600dp-v23)以支持更具体的配置。

于 2017-10-04T00:02:36.307 回答
0
ViewGroup view = (ViewGroup)getWindow().getDecorView();
LinearLayout content = (LinearLayout)view.getChildAt(0);
int id = content.getId();

id 告诉您正在使用哪种布局(假设您在 XML 中设置了 id 标记)。

于 2012-05-21T16:55:14.297 回答