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 の場合は null であることに気付きました。
同様に、実行時に AppWidget の context.getResources() から取得した Resources オブジェクトを使用してリソースを取得すると、画面密度に基づいて間違ったリソースが返されます。たとえば、mdpi には 60x60px のドローアブルがあり、hdpi には 80x80 のドローアブルがあります。context.getResources().getDrawable(...) を使用してこの Drawable オブジェクトを取得すると、60x60 バージョンが返されます。
AppWidget のコンテキストから実行時にリソースを正しく処理する方法はありますか?
ありがとう!