Androidの実行時に画面幅をDPまたはDIPで判断するにはどうすればよいですか?


192

私はdip / dp(Javaファイル内)を使用してAndroidウィジェットのレイアウトをコーディングする必要があります。実行時にコード化すると

int pixel=this.getWindowManager().getDefaultDisplay().getWidth()

これは、画面の幅をピクセル(px)で返します。これをdpに変換するために、私はコーディングしました:

int dp =pixel/(int)getResources().getDisplayMetrics().density ;

これは正しい答えを返さないようです。画面解像度が480×800のWVGA800のエミュレータを作りました。エミュレータを実行してコードにpixelとdpの値を印刷させたところ、どちらも320になりました。このエミュレータは240 dpiで、スケール係数は0.75です。

回答:


376

これを試して

Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics outMetrics = new DisplayMetrics ();
display.getMetrics(outMetrics);

float density  = getResources().getDisplayMetrics().density;
float dpHeight = outMetrics.heightPixels / density;
float dpWidth  = outMetrics.widthPixels / density;

または

ありがとう@TomášHubálek

DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();    
float dpHeight = displayMetrics.heightPixels / displayMetrics.density;
float dpWidth = displayMetrics.widthPixels / displayMetrics.density;

90
なぜWindowManagerを呼び出す必要があるのですか?このコードはどうですか?DisplayMetrics displayMetrics = resources.getDisplayMetrics(); float screenWidthDp = displayMetrics.widthPixels / displayMetrics.density;
トマーシュHubálek

2
これは、非常に高密度の画面を使用している場合は機能しませんでした。画面のほんの一部しか得られなかったかのようでした。このソリューションは私にとってうまくいきました:stackoverflow.com/a/18712361/956975 Display display = getWindowManager()。getDefaultDisplay(); ポイントサイズ= new Point(); display.getSize(size); int width = size.x; int height = size.y;
marienke 14

1
@dsdsdsdsd:contextは、Contextクラスのインスタンスです。特に、ActivityはContextのサブクラスです(これをActivityで使用し、getActivity()をFragmentで使用します)。アプリケーションとサービスもコンテキストのサブクラスです。
フランソワ・POYER

112

私はGoogleからこの質問に出くわしましたが、後にAPI> = 13に有効な簡単な解決策を見つけました。

今後の参考のために:

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.

参照してください。Configurationクラスの参照を

編集:Nick Baicoianuが指摘したように、これは画面の使用可能な幅/高さを返します(ほとんどの用途で興味深いものです)。実際のディスプレイの寸法が必要な場合は、上の答えに固執してください。


23
ConfigurationのscreenWidthDp / screenHeightDpとDisplayMetrics widthPixels / heightPixelsの使用の1つの重要な違いは、Configurationが使用可能な表示サイズ(ステータスバーなどを除く)を返すのに対し、DisplayMetricsは全画面サイズを返すことです。
Nick Baicoianu 2014

これは、APIレベル13以上の場合のみ
小野2015

@NickBaicoianuのコメントに追加するには、getConfiguration()メソッドとgetDisplayMetrics()メソッドの両方がマルチウィンドウモードで機能します。つまり、サイズは画面ではなくウィンドウのサイズを反映しています。
nmw 2018年

7

デフォルトの密度値160がありません。

    2 px = 3 dip if dpi == 80(ldpi), 320x240 screen
    1 px = 1 dip if dpi == 160(mdpi), 480x320 screen
    3 px = 2 dip if dpi == 240(hdpi), 840x480 screen

つまり、縦長モードで160dipに等しい幅でレイアウトをデザインすると、すべてのldpi / mdpi / hdpiデバイス(タブレットを除く)では画面の半分になります


あなたが答えたのは、私の質問の背後にある論理的な推論です。これは分かります。実行時に画面解像度が何であれ、正しいdpi幅がコードによって選択されるように、これをJavaでどのようにコーディングする必要がありますか?
Khushboo

今回は正しく理解できるといいのですが:) DisplayMetrics outMetrics = null; getWindowManager().getDefaultDisplay().getMetrics(outMetrics);Activity内で使用します。次に、ドキュメントにoutMetrics.density記載されているように、現在のデバイスのスケールファクタを提供します
Mykhailo Gaidai

6

代わりにこれを使用するのはどうですか?

final DisplayMetrics displayMetrics=getResources().getDisplayMetrics();
final float screenWidthInDp=displayMetrics.widthPixels/displayMetrics.density;
final float screenHeightInDp=displayMetrics.heightPixels/displayMetrics.density;

6
DisplayMetrics displayMetrics = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);

int width_px = Resources.getSystem().getDisplayMetrics().widthPixels;

int height_px =Resources.getSystem().getDisplayMetrics().heightPixels;

int pixeldpi = Resources.getSystem().getDisplayMetrics().densityDpi;


int width_dp = (width_px/pixeldpi)*160;
int height_dp = (height_px/pixeldpi)*160;

8
いくつかの説明を与えることを検討してください
bigbounty

5

コトリンでの回答:

  context?.let {
        val displayMetrics = it.resources.displayMetrics
        val dpHeight = displayMetrics.heightPixels / displayMetrics.density
        val dpWidth = displayMetrics.widthPixels / displayMetrics.density
    }

4

Kotlinの簡略化:

val widthDp = resources.displayMetrics.run { widthPixels / density }
val heightDp = resources.displayMetrics.run { heightPixels / density }

2

いくつかの良い装飾を施したDPの観点から画面の幅と高さを取得します。

ステップ1:インターフェースを作成する

public interface ScreenInterface {

   float getWidth();

   float getHeight();

}

ステップ2:インプリメンタークラスを作成する

public class Screen implements ScreenInterface {
    private Activity activity;

    public Screen(Activity activity) {
        this.activity = activity;
    }

    private DisplayMetrics getScreenDimension(Activity activity) {
        DisplayMetrics displayMetrics = new DisplayMetrics();
        activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        return displayMetrics;
    }

    private float getScreenDensity(Activity activity) {
        return activity.getResources().getDisplayMetrics().density;
    }

    @Override
    public float getWidth() {
        DisplayMetrics displayMetrics = getScreenDimension(activity);
        return displayMetrics.widthPixels / getScreenDensity(activity);
    }

    @Override
    public float getHeight() {
        DisplayMetrics displayMetrics = getScreenDimension(activity);
        return displayMetrics.heightPixels / getScreenDensity(activity);
    }
} 

ステップ3:アクティビティの幅と高さを取得します。

Screen screen = new Screen(this); // Setting Screen
screen.getWidth();
screen.getHeight();

これは高さと幅をピクセルまたはdpで返しますか?
Taslim Oseni

.densityと呼ばれているため、dpで表示されます
Ali Azaz Alam

単純なタスクを解決するためにアプリにコードのトーンを追加するのは良い考えではないと思います
Ruslan Berozov

クラスを実装するか、直接コード化するかは、あなた次第です。定義されたクラスから、直接実装するコードを簡単に抽出できます。
Ali Azaz Alam、

0

画面の幅について知りたいだけの場合は、開発者向けオプションで「最小の画面の幅」を検索できます。編集することもできます。



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.