如何使用布局限定符确定屏幕宽度?

时间:2017-08-05 17:39:30

标签: android

为不同屏幕宽度提供布局的推荐方法是使用layout-swxxdp限定符将每个依赖于屏幕的布局包含在文件夹中:

res/layout-sw600dp/   # For 7” tablets (600dp wide and bigger)
res/layout-sw720dp/   # For 10” tablets (720dp wide and bigger)
res/layout-sw600dp-port/   # For 7” tablets in portrait (600dp wide or bigger)
res/layout-sw720dp-port/  # For 10” tablets in portrait (720dp wide or bigger)

Android会根据屏幕宽度自动为正确的布局充气。

Android可以找出要使用的布局,这很棒,但如果我的活动类中需要运行与屏幕大小相关的Java代码,该怎么办?以下方法的实现是什么样的?

// Returns true if the screen width is 600 dp or more
is600dp();

我见过像这样的方法

// Returns true if the screen is at least 
// approximately 480x640 dp units
private boolean isLarge(){
    return (this.getResources().getConfiguration().screenLayout
            & Configuration.SCREENLAYOUT_SIZE_MASK)
            >= Configuration.SCREENLAYOUT_SIZE_LARGE;
}

现在如果我的设备有600dp的屏幕宽度怎么办,但上面的方法返回false? Android会扩展正确的布局,但我的设备特定代码无法运行。

我甚至有意义吗?

2 个答案:

答案 0 :(得分:2)

就像你可以在res/layout-sw600dp/文件夹中放置布局一样,你可以将布尔值放在res/values-sw600dp/文件夹中:

<resources>
  <bool name="is600dp">true</bool>
</resources>

然后使用

在运行时引用它
boolean is600dp = getResources().getBoolean(R.id.is600dp);

答案 1 :(得分:1)

您可以在单独的值文件夹中为该整数设置一个整数并使用不同的值。并从Java代码中获取运行时的整数值。

RES /值/ integers.xml

<integer name="layout_value">1</integer>

RES /值-sw600dp / integers.xml

<integer name="layout_value">2</integer>

或者,获取屏幕宽度并检查。

这为您提供了屏幕宽度(以像素为单位):

DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int width = displayMetrics.widthPixels;

如果您只需要应用程序屏幕的宽度,在多窗口世界中,您应该使用:

Configuration configuration = yourActivity.getResources().getConfiguration();
int screenWidthDp = configuration.screenWidthDp; //The current width of the available screen space, in dp units, corresponding to screen width resource qualifier.
int smallestScreenWidthDp = configuration.smallestScreenWidthDp; //The smallest screen size an application will see in normal operation, corresponding to smallest screen width resource qualifier.