Android:获取屏幕分辨率/像素为整数值

11

这是一个非常简单的问题,但我没有找到答案:/如何快速访问屏幕分辨率(宽度、高度)的整数值?

我尝试了这个方法,但在我的模拟器上总是显示为零:

DisplayMetrics dm = new DisplayMetrics();
int width = dm.widthPixels / 2;

在我的情况下,我想动态创建一个带有tableRows的表格,每个tableRow包含两列。这些列都应该占据屏幕一半的宽度。

有人能给我指点一下吗?


只是猜测 - 从DisplayMetrics检索到的值可能在第一次绘制之前无效。您是在onCreate还是onDraw或何时进行检查? - SteelBytes
结果为零的真正原因是因为在Java中,0是int类型的默认值。 dm.widthPixels 没有被初始化,所以它的值为零,0除以2也是零...你应该尝试类似 mView.getContext().getResources().getDisplayMetrics() 这样的东西。 - Armin
5个回答

36

trashkalmar的回答是正确的。

但是,结果将具体取决于活动上下文。如果您想要整个设备屏幕分辨率:

DisplayMetrics displayMetrics = new DisplayMetrics();
WindowManager wm = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE); // the results will be higher than using the activity context object or the getWindowManager() shortcut
wm.getDefaultDisplay().getMetrics(displayMetrics);
int screenWidth = displayMetrics.widthPixels;
int screenHeight = displayMetrics.heightPixels;

请注意,结果还取决于当前设备的方向。


18

您可以使用以下方法获取屏幕指标:

Display d = ((WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int width = d.getWidth();
int height = d.getHeight();

1
我收到一个@deprecated警告,没有进一步的解释。使用Guillaume Perrot的答案代替。 - Moak
@Moak,自Android API 13以来,它已被弃用。请参阅文档 - Aritz

8

1.在活动中使用此代码即可获取屏幕宽度和高度像素。

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay()
    .getMetrics(metrics);
int width = metrics.widthPixels;
int height = metrics.heightPixels;

2. 这也可以被使用,但需要 API 级内联检查。

Display display = getWindowManager().getDefaultDisplay();

Point size = new Point();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
    display.getSize(size);
    int width2 = size.x;
    int height2 = size.y;

} else {
    int width2 = display.getWidth();
    int height2 = display.getHeight();
}

3. 当你没有活动但有上下文时,请使用此选项

WindowManager wm = (WindowManager) context.getSystemService(
            Context.WINDOW_SERVICE);
Display display1 = wm.getDefaultDisplay();
Point size1 = new Point();

int width1;
int height1;

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {

    display1.getSize(size1);
    width1 = size1.x;
    height1 = size1.y;

} else {
    width2 = display.getWidth();
    height2 = display.getHeight();
}

4

我使用以下内容:

int scrWidth  = getWindowManager().getDefaultDisplay().getWidth();
int scrHeight = getWindowManager().getDefaultDisplay().getHeight();

没有麻烦,只有两个类变量。

3
最简单的方法是实现onSizeChanged。你可能会得到一个值为0,因为视图还没有初始化。例如,你不能在View构造函数中调用上面的代码。

那么对于我来说意味着什么呢?当我动态地想要添加TableRows并在完成后将表格添加到主LinearLayout并将其设置为ContentView(使用this.setContentView(ll),其中ll是我的linearLayout)时,这意味着什么? - poeschlorn
onSizeChanged方法会在View第一次被绘制时以及屏幕方向改变时被调用。当它被调用时,将屏幕的尺寸存储在类的成员变量中。在OnDraw方法中使用这些值进行绘制。 - kgiannakakis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接