コードを使用してデバイスの画面サイズカテゴリ(小、標準、大、x大)を決定する方法


308

現在のデバイスの画面サイズのカテゴリ(小、標準、大、x大など)を判別する方法はありますか?

密度ではなく、画面サイズ。

回答:


420

Configuration.screenLayoutビットマスクを使用できます。

例:

if ((getResources().getConfiguration().screenLayout & 
    Configuration.SCREENLAYOUT_SIZE_MASK) == 
        Configuration.SCREENLAYOUT_SIZE_LARGE) {
    // on a large screen device ...

}

31
x-large検出を取得するには、プロジェクトで必ずターゲットandroid-3.0を使用してください。または、x-largeには静的な値4を使用します。
Peterdk、2011年

5
一部のデバイスでは画面のサイズが未定義になる可能性があるため、Configuration.SCREENLAYOUT_SIZE_UNDEFINEDで確認することもできます。
valerybodak 2013

> =を使用して画面を大きくまたは大きくできますか?
Andrew S

150

以下のコードは、上記の答えを具体し、画面サイズをトーストとして表示します

//Determine screen size
if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE) {
    Toast.makeText(this, "Large screen", Toast.LENGTH_LONG).show();
}
else if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_NORMAL) {
    Toast.makeText(this, "Normal sized screen", Toast.LENGTH_LONG).show();
}
else if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_SMALL) {
    Toast.makeText(this, "Small sized screen", Toast.LENGTH_LONG).show();
}
else {
    Toast.makeText(this, "Screen size is neither large, normal or small", Toast.LENGTH_LONG).show();
}

以下のコードは、画面密度をトーストとして表示します

//Determine density
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int density = metrics.densityDpi;

if (density == DisplayMetrics.DENSITY_HIGH) {
    Toast.makeText(this, "DENSITY_HIGH... Density is " + String.valueOf(density), Toast.LENGTH_LONG).show();
}
else if (density == DisplayMetrics.DENSITY_MEDIUM) {
    Toast.makeText(this, "DENSITY_MEDIUM... Density is " + String.valueOf(density), Toast.LENGTH_LONG).show();
}
else if (density == DisplayMetrics.DENSITY_LOW) {
    Toast.makeText(this, "DENSITY_LOW... Density is " + String.valueOf(density), Toast.LENGTH_LONG).show();
}
else {
    Toast.makeText(this, "Density is neither HIGH, MEDIUM OR LOW.  Density is " + String.valueOf(density), Toast.LENGTH_LONG).show();
}

トーストはおいしいです。
MinceMan 2011

誰かが特大を確認できますか?
Nathan H

68

静的ヘルパーメソッドとしてのJeff Gilfeltの答え:

private static String getSizeName(Context context) {
    int screenLayout = context.getResources().getConfiguration().screenLayout;
    screenLayout &= Configuration.SCREENLAYOUT_SIZE_MASK;

    switch (screenLayout) {
    case Configuration.SCREENLAYOUT_SIZE_SMALL:
        return "small";
    case Configuration.SCREENLAYOUT_SIZE_NORMAL:
        return "normal";
    case Configuration.SCREENLAYOUT_SIZE_LARGE:
        return "large";
    case 4: // Configuration.SCREENLAYOUT_SIZE_XLARGE is API >= 9
        return "xlarge";
    default:
        return "undefined";
    }
}

12
private String getDeviceDensity() {
    int density = mContext.getResources().getDisplayMetrics().densityDpi;
    switch (density)
    {
        case DisplayMetrics.DENSITY_MEDIUM:
            return "MDPI";
        case DisplayMetrics.DENSITY_HIGH:
            return "HDPI";
        case DisplayMetrics.DENSITY_LOW:
            return "LDPI";
        case DisplayMetrics.DENSITY_XHIGH:
            return "XHDPI";
        case DisplayMetrics.DENSITY_TV:
            return "TV";
        case DisplayMetrics.DENSITY_XXHIGH:
            return "XXHDPI";
        case DisplayMetrics.DENSITY_XXXHIGH:
            return "XXXHDPI";
        default:
            return "Unknown";
    }
}

1
画面の密度を取得します。質問は「密度ではなく画面サイズ」を指定します。
田代スバル

11

上記の回答をありがとう、それは私を大いに助けました:-)しかし、Android 1.5のサポートを余儀なくされた(私のような)人々のために、後方互換性のためにJavaリフレクションを使用できます:

Configuration conf = getResources().getConfiguration();
int screenLayout = 1; // application default behavior
try {
    Field field = conf.getClass().getDeclaredField("screenLayout");
    screenLayout = field.getInt(conf);
} catch (Exception e) {
    // NoSuchFieldException or related stuff
}
// Configuration.SCREENLAYOUT_SIZE_MASK == 15
int screenType = screenLayout & 15;
// Configuration.SCREENLAYOUT_SIZE_SMALL == 1
// Configuration.SCREENLAYOUT_SIZE_NORMAL == 2
// Configuration.SCREENLAYOUT_SIZE_LARGE == 3
// Configuration.SCREENLAYOUT_SIZE_XLARGE == 4
if (screenType == 1) {
    ...
} else if (screenType == 2) {
    ...
} else if (screenType == 3) {
    ...
} else if (screenType == 4) {
    ...
} else { // undefined
    ...
}

2
プラットフォームの最新バージョンを対象とし、Configurationクラスから定数を参照できます。これらは、コンパイル時にインライン化される(つまり、実際の値に置き換えられる)静的な最終値であるため、コードが古いバージョンのプラットフォームで壊れることはありません。
からくり

わかりませんでした... android:targetSdkVersionについて話していますか?
A.マッソン2013

1
はい、特定のバージョンをどのようにターゲットにするかです。ほとんどの人(少なくとも私が見たことがある人)targetSdkVersionは最新のリリースに設定しました。
からくり

9

Androidデバイスの画面密度とサイズを簡単に知りたい場合は、この無料アプリを使用できます(権限は必要ありません)。https//market.android.com/details?id = com.jotabout.screeninfo


3
この質問は特定のデバイスに関するものではなく、複数のデバイスプロファイルのプログラミングに関するものです(これはモバイルプラットフォーム向けに開発する場合の重要なソフトウェア開発プロセスです)。
mtmurdock

1
知っておくと良いアプリが市場に出回っています-アプリがその情報を思いつくために使用するコードを見るのも良いでしょう
Stan Kurdziel 2012

4
@StanKurdzielソースコードはMITオープンソースライセンスの下で公開されており、次のURLから
mportuesisf

このリンクは死んでいます
Vadim Kotov

5

xlarge画面とx..high密度を確認する必要がありますか?これは、選択した回答から変更されたコードです。

//Determine screen size
if ((getResources().getConfiguration().screenLayout &      Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE) {     
    Toast.makeText(this, "Large screen",Toast.LENGTH_LONG).show();
} else if ((getResources().getConfiguration().screenLayout &      Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_NORMAL) {     
    Toast.makeText(this, "Normal sized screen" , Toast.LENGTH_LONG).show();
} else if ((getResources().getConfiguration().screenLayout &      Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_SMALL) {     
    Toast.makeText(this, "Small sized screen" , Toast.LENGTH_LONG).show();
} else if ((getResources().getConfiguration().screenLayout &      Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_XLARGE) {     
    Toast.makeText(this, "XLarge sized screen" , Toast.LENGTH_LONG).show();
} else {
    Toast.makeText(this, "Screen size is neither large, normal or small" , Toast.LENGTH_LONG).show();
}

//Determine density
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int density = metrics.densityDpi;

if (density==DisplayMetrics.DENSITY_HIGH) {
    Toast.makeText(this, "DENSITY_HIGH... Density is " + String.valueOf(density),  Toast.LENGTH_LONG).show();
} else if (density==DisplayMetrics.DENSITY_MEDIUM) {
    Toast.makeText(this, "DENSITY_MEDIUM... Density is " + String.valueOf(density),  Toast.LENGTH_LONG).show();
} else if (density==DisplayMetrics.DENSITY_LOW) {
    Toast.makeText(this, "DENSITY_LOW... Density is " + String.valueOf(density),  Toast.LENGTH_LONG).show();
} else if (density==DisplayMetrics.DENSITY_XHIGH) {
    Toast.makeText(this, "DENSITY_XHIGH... Density is " + String.valueOf(density),  Toast.LENGTH_LONG).show();
} else if (density==DisplayMetrics.DENSITY_XXHIGH) {
    Toast.makeText(this, "DENSITY_XXHIGH... Density is " + String.valueOf(density),  Toast.LENGTH_LONG).show();
} else if (density==DisplayMetrics.DENSITY_XXXHIGH) {
    Toast.makeText(this, "DENSITY_XXXHIGH... Density is " + String.valueOf(density),  Toast.LENGTH_LONG).show();
} else {
    Toast.makeText(this, "Density is neither HIGH, MEDIUM OR LOW.  Density is " + String.valueOf(density),  Toast.LENGTH_LONG).show();
}

[密度]この場合、あなたは活動している必要があります。外にいる場合は、getWindowManager()を使用してください。このコードWindowManager windowManager =(WindowManager)context .getSystemService(Context.WINDOW_SERVICE);
horkavlna 2016

3

これがトム・マクファーリンの答えの Xamarin.Androidバージョンです

        //Determine screen size
        if ((Application.Context.Resources.Configuration.ScreenLayout & ScreenLayout.SizeMask) == ScreenLayout.SizeLarge) {
            Toast.MakeText (this, "Large screen", ToastLength.Short).Show ();
        } else if ((Application.Context.Resources.Configuration.ScreenLayout & ScreenLayout.SizeMask) == ScreenLayout.SizeNormal) {
            Toast.MakeText (this, "Normal screen", ToastLength.Short).Show ();
        } else if ((Application.Context.Resources.Configuration.ScreenLayout & ScreenLayout.SizeMask) == ScreenLayout.SizeSmall) {
            Toast.MakeText (this, "Small screen", ToastLength.Short).Show ();
        } else if ((Application.Context.Resources.Configuration.ScreenLayout & ScreenLayout.SizeMask) == ScreenLayout.SizeXlarge) {
            Toast.MakeText (this, "XLarge screen", ToastLength.Short).Show ();
        } else {
            Toast.MakeText (this, "Screen size is neither large, normal or small", ToastLength.Short).Show ();
        }
        //Determine density
        DisplayMetrics metrics = new DisplayMetrics();
        WindowManager.DefaultDisplay.GetMetrics (metrics);
        var density = metrics.DensityDpi;
        if (density == DisplayMetricsDensity.High) {
            Toast.MakeText (this, "DENSITY_HIGH... Density is " + density, ToastLength.Long).Show ();
        } else if (density == DisplayMetricsDensity.Medium) {
            Toast.MakeText (this, "DENSITY_MEDIUM... Density is " + density, ToastLength.Long).Show ();
        } else if (density == DisplayMetricsDensity.Low) {
            Toast.MakeText (this, "DENSITY_LOW... Density is " + density, ToastLength.Long).Show ();
        } else if (density == DisplayMetricsDensity.Xhigh) {
            Toast.MakeText (this, "DENSITY_XHIGH... Density is " + density, ToastLength.Long).Show ();
        } else if (density == DisplayMetricsDensity.Xxhigh) {
            Toast.MakeText (this, "DENSITY_XXHIGH... Density is " + density, ToastLength.Long).Show ();
        } else if (density == DisplayMetricsDensity.Xxxhigh) {
            Toast.MakeText (this, "DENSITY_XXXHIGH... Density is " + density, ToastLength.Long).Show ();
        } else {
            Toast.MakeText (this, "Density is neither HIGH, MEDIUM OR LOW.  Density is " + density, ToastLength.Long).Show ();
        }

2
一部のコードをダンプするだけでなく、実行した内容とこれがどのように役立つかを説明してください
David Medenjak

2

この関数を試してくださいisLayoutSizeAtLeast(int screenSize)

小さな画面を確認するには、少なくとも320x426 dp以上 getResources()。getConfiguration()。isLayoutSizeAtLeast(Configuration.SCREENLAYOUT_SIZE_SMALL);

通常の画面を確認するには、少なくとも320x470 dp以上 getResources()。getConfiguration()。isLayoutSizeAtLeast(Configuration.SCREENLAYOUT_SIZE_NORMAL);

大画面を確認するには、少なくとも480x640 dp以上 getResources()。getConfiguration()。isLayoutSizeAtLeast(Configuration.SCREENLAYOUT_SIZE_LARGE);

特大画面を確認するには、少なくとも720x960 dp以上 getResources()。getConfiguration()。isLayoutSizeAtLeast(Configuration.SCREENLAYOUT_SIZE_XLARGE);


いいね!このメソッドは、APIレベル11でも使用できます。
Enselic '10

2

2018年にKotlinでJeffの回答が必要な場合は、次のとおりです。

  private fun determineScreenSize(): String {
    // Thanks to https://stackoverflow.com/a/5016350/2563009.
    val screenLayout = resources.configuration.screenLayout
    return when {
      screenLayout and Configuration.SCREENLAYOUT_SIZE_MASK == Configuration.SCREENLAYOUT_SIZE_SMALL -> "Small"
      screenLayout and Configuration.SCREENLAYOUT_SIZE_MASK == Configuration.SCREENLAYOUT_SIZE_NORMAL -> "Normal"
      screenLayout and Configuration.SCREENLAYOUT_SIZE_MASK == Configuration.SCREENLAYOUT_SIZE_LARGE -> "Large"
      screenLayout and Configuration.SCREENLAYOUT_SIZE_MASK == Configuration.SCREENLAYOUT_SIZE_XLARGE -> "Xlarge"
      screenLayout and Configuration.SCREENLAYOUT_SIZE_MASK == Configuration.SCREENLAYOUT_SIZE_UNDEFINED -> "Undefined"
      else -> error("Unknown screenLayout: $screenLayout")
    }
  }

1

文字列リソースと列挙型を使用してこれを行うことはできませんか?SMALL、MEDIUM、LARGEなどの画面サイズの名前を持つ文字列リソースを定義できます。次に、文字列リソースの値を使用して、列挙型のインスタンスを作成できます。

  1. 気になるさまざまな画面サイズのEnumをコードで定義します。

    public Enum ScreenSize {
        SMALL,
        MEDIUM,
        LARGE,;
    }
  2. 文字列リソース、たとえばscreensizeを定義します。その値はSMALL、MEDIUM、またはLARGEのいずれかです。

    <string name="screensize">MEDIUM</string>
  3. screensize気になる各次元の文字列リソースにのコピーを置きます。
    たとえば<string name="screensize">MEDIUM</string>、values-sw600dp / strings.xmlおよびvalues-medium / strings.xmlおよび<string name="screensize">LARGE</string>移動し、sw720dp / strings.xmlおよびvalues-large / strings.xmlに移動します。
  4. コードで、
    ScreenSize size = ScreenSize.valueOf(getReources().getString(R.string.screensize);

これは順調でした...しかし、私は3つのデバイスでテストしましたが、タブレットがまだ大きいと予想しているのに、SMALLが返されます。私のstring.xmlファイルは、values-h1024dp、values-h700dp、values-h200dp内で定義され、対応する<string name = "screensize"> xxxxxx </ string>
A. Masson

1

このコードをコピーしてに貼り付け、Activity実行するとToast、デバイスの画面サイズカテゴリが表示されます。

int screenSize = getResources().getConfiguration().screenLayout &
        Configuration.SCREENLAYOUT_SIZE_MASK;

String toastMsg;
switch(screenSize) {
    case Configuration.SCREENLAYOUT_SIZE_LARGE:
        toastMsg = "Large screen";
        break;
    case Configuration.SCREENLAYOUT_SIZE_NORMAL:
        toastMsg = "Normal screen";
        break;
    case Configuration.SCREENLAYOUT_SIZE_SMALL:
        toastMsg = "Small screen";
        break;
    default:
        toastMsg = "Screen size is neither large, normal or small";
}
Toast.makeText(this, toastMsg, Toast.LENGTH_LONG).show();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.