如何从 Android 中的 AppWidget 获取正确的 DisplayMetrics?

Posted

技术标签:

【中文标题】如何从 Android 中的 AppWidget 获取正确的 DisplayMetrics?【英文标题】:How can I get the correct DisplayMetrics from an AppWidget in Android? 【发布时间】:2011-02-08 05:58:38 【问题描述】:

我需要在 android AppWidget 中确定运行时的屏幕密度。我已经设置了一个 HDPI 仿真器设备 (avd)。如果设置一个常规的可执行项目,并将这段代码插入到 onCreate 方法中:

DisplayMetrics dm = getResources().getDisplayMetrics();
Log.d("MyTag", "screen density " + dm.densityDpi);

这会按预期输出“屏幕密度 240”。

但是,如果我设置了一个 AppWidget 项目,并将这段代码插入到 onUpdate 方法中:

DisplayMetrics dm = context.getResources().getDisplayMetrics();
Log.d("MyTag", "screen density " + dm.densityDpi);

这会输出“屏幕密度 160”。我注意到,在连接调试器时,这里 Resources 对象的 mDefaultDisplay 成员在 AppWidget 案例中为空。

同样,如果我在运行时使用从 AppWidget 中的 context.getResources() 获得的 Resources 对象获取资源,它会根据屏幕密度返回错误的资源。例如,我有一个 60x60px 的 mdpi 可绘制对象和一个 80x80 的 hdpi 可绘制对象。如果我使用 context.getResources().getDrawable(...) 获取此 Drawable 对象,它会返回 60x60 版本。

有什么方法可以在运行时从 AppWidget 的上下文中正确处理资源?

谢谢!

【问题讨论】:

【参考方案1】:

这感觉像是一个错误。如果您可以创建演示错误的示例项目,请在Android issue tracker 上发布问题。如果您想到了,请在此处添加指向该问题的评论。

【讨论】:

嗯。我创建了一个简单的小部件,除了演示这个错误之外什么都不做,它在 HDPI 仿真器设备中正确显示 240。我会回去尝试找出我的其他小部件有什么不同。感谢收看。 啊哈。我的清单中缺少 标记。如果我将 min sdk 版本设置为 >= 4,我会在运行时获得正确的屏幕密度。

以上是关于如何从 Android 中的 AppWidget 获取正确的 DisplayMetrics?的主要内容,如果未能解决你的问题,请参考以下文章

如何将列表视图设置为 appwidget?

android开发中appwidget 中的listView的数据怎么刷新

android 中的appwidget中加了listview,怎么让点击listview中的item后跳转到app主页面

Android:NPE 在尝试使用 ACTION_APPWIDGET_PICK 意图进行 activityForResult 时

为啥android中AppWidget中的配置属性updatePeriodMillis不能更新?也就是不起作用.

Android Clickable AppWidget 禁用点击声音