Androidで画面の寸法をピクセルとして取得する方法


1843

いくつかのカスタム要素を作成し、それらをプログラムで右上隅(上端nからのピクセルと右端からのピクセル)に配置したいと思いmます。したがって、画面の幅と高さを取得して、位置を設定する必要があります。

int px = screenWidth - m;
int py = screenHeight - n;

どうすれば入手できますscreenWidthし、screenHeightメインの活動では?


pxの代わりにdpを使用します。それは...他のデバイスを使用してレイアウトを歪曲しますので
ジャワドゼブ

表示スケーリングを考慮してgetResources()。getDisplayMetrics()。densityを乗算することを忘れないでください
jmaculate

これは、最も投票された回答が常に最良であるとは限らないことを証明します(多くの人が担当者のために回答を繰り返します)。getSizeおよび非推奨のgetWidth / getHeightコンボ(エラーを無視)の代わりに、Balaji.Kを試してくださいgetMetrics。Nikの彼の回答でのコメントはgetDisplayMetrics、システム/ステータスバーのサイズを考慮することについても説明しています。また、あなたが使用すること密度を jmaculateとし、LoungeKattは持って説明EXACT値:DisplayMetrics dm = getResources().getDisplayMetrics(); float fwidth = dm.density * dm.widthPixels;Androidのバージョン2.2(API 8)でテストし、良い結果としてV4.0 エラーなし/警告を
Armfoot

DisplayMetrics displaymetrics = new DisplayMetrics(); getWindowManager()。getDefaultDisplay()。getMetrics(displaymetrics); int height = displaymetrics.heightPixels; int width = displaymetrics.widthPixels;
アザハル

DisplayMetricsを取得する別の方法:Resources.getSystem().getDisplayMetrics()。あなたはContextそれらを取得する必要はありません。
タグ

回答:


3479

ピクセル単位の表示寸法が必要な場合は、次を使用できますgetSize

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;

あなたがいない場合は、Activity次の方法でデフォルトDisplayを取得できますWINDOW_SERVICE

WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();

フラグメントにいてこれを達成したい場合は、Activity.WindowManager(Xamarin.Androidの場合)またはgetActivity()。getWindowManager()(Javaの場合)を使用します。

getSize(APIレベル13で)導入される前は、getWidthおよびgetHeight非推奨となったメソッドを使用できました。

Display display = getWindowManager().getDefaultDisplay(); 
int width = display.getWidth();  // deprecated
int height = display.getHeight();  // deprecated

ただし、説明しているユースケースでは、レイアウトのマージン/パディングの方が適切と思われます。

別の方法は次のとおりです。DisplayMetrics

サイズ、密度、フォントスケーリングなど、ディスプレイに関する一般的な情報を記述する構造。DisplayMetricsメンバーにアクセスするには、次のようにオブジェクトを初期化します。

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);

次のwidthPixels情報を取得するために使用できます。

「ディスプレイの絶対幅(ピクセル単位)。」

例:

Log.d("ApplicationTagName", "Display width in px is " + metrics.widthPixels);

13
getWidth()またはgetSize()?アプリをAPI <13およびAPI> 13で実行する必要がある場合、何を使用しますか?
キャロル

52
{display.getSize(size);を試してください 幅= size.x; 高さ= size.y; } catch(NoSuchMethodError e){width = display.getWidth(); height = display.getHeight(); }
Arnaud

248
なぜあなたtry/catchがそのようなチェックに使いたいのかわかりませんか?if (android.os.Build.VERSION.SDK_INT >= 13)例外をスローせずに単に使用しないのはなぜですか?try/catch通常のアプリフローでは悪い習慣だと思います。
Patrik

2
@ A-Liveを実行すると、アプリも破損します(ただしクラッシュしません)。それにもかかわらず、開発者は新しいosバージョンを事前にチェックする必要があります。また、この引数を使用すると、コード行を数行おきにtry / catchで囲むことができます。
Patrik

11
ナビゲーションバーや通知バーを除いた画面サイズを取得したい場合
Android開発者

375

1つの方法は次のとおりです。

Display display = getWindowManager().getDefaultDisplay(); 
int width = display.getWidth();
int height = display.getHeight();

これは非推奨です。代わりに次のコードを試してください。コードの最初の2行はDisplayMetricsオブジェクトを示しています。このオブジェクトはのようなフィールドが含まれていますheightPixelswidthPixels

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);

int height = metrics.heightPixels;
int width = metrics.widthPixels;

14
メトリック(幅、高さ)は、デバイスの回転に応じて変化することに注意してください。
Tony Chan

8
メトリクスはディスプレイのサイズを返しますが、HoneyComb以上の場合、システムバーのために返されるものよりもアクティビティのスペースが少なくなります。

3
@ガイそれはあなたの実装に依存します。ステータスバーは非表示にできます。requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow()。setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN、WindowManager.LayoutParams.FLAG_FULLSCREEN);
Hagai L

79
この方法でも存在します:getContext()。getResources()。getDisplayMetrics()。widthPixels
Nik

final float scale = getResources()。getDisplayMetrics()。density; int幅=(int)(metrics.widthPixels *スケール+ 0.5f); -そのようにする場合、デバイス密度を考慮する必要があります。
放棄されたカート

120

それはあなたの質問に答えないかもしれませんが、ビューの次元が必要だが、レイアウトがまだレイアウトされていないときにコードが実行されている場合、(私がこの質問に来たときに自分で探していました) (例:でonCreate())を設定しViewTreeObserver.OnGlobalLayoutListenerView.getViewTreeObserver().addOnGlobalLayoutListener()、ビューのディメンションを必要とする関連コードをそこに配置できます。リスナーのコールバックは、レイアウトがレイアウトされたときに呼び出されます。


または単にview.postを書く
Lukas Hanacek '19

ただし、view.postの動作は保証されていません。それは単なる回避策です。
marsbear 2014

@marsbear動作がView.post()保証されていないのはどこですか?レイアウト後にビューのサイズを取得するためにこの方法にも依存していて、信頼性が低いことに気付いていなかったので、私は興味があります。
Tony Chan

@Turbo私はそれを言います:p以前にその回避策を使用しましたが、信頼できないことが判明しました。この回避策は、初期レイアウトが初期化と同じUIThreadターン内で行われるという想定に基づいています。したがって、post()を介して次のUIがオンになる前に実行するようにコードをスケジュールして、問題ないようにすることができます。特定の状況下ではレイアウトにさらに時間がかかる可能性があり、投稿されたコードが実行されたときにビューがまだレイアウトされていないことがわかりました。ここでは、onCreateにViewTreeObserverを追加し、最初のonLayoutの後に削除します。最初のonLayoutの間に自分のものを初期化します。
marsbear 14年

@marsbearどちらからView取得するViewTreeObserverかは重要ですか?または、それらはすべて同じものを共有しますか?
Tony Chan

109

(2012年の回答、古くなっている可能性があります)Honeycomb以前をサポートする場合は、API 13より前に下位互換性を確保する必要があります。

int measuredWidth = 0;
int measuredHeight = 0;
WindowManager w = getWindowManager();

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
    Point size = new Point();
    w.getDefaultDisplay().getSize(size);
    measuredWidth = size.x;
    measuredHeight = size.y;
} else {
    Display d = w.getDefaultDisplay();
    measuredWidth = d.getWidth();
    measuredHeight = d.getHeight();
}

もちろん、非推奨のメソッドは最終的に最新のSDKから削除されますが、私たちは依然としてほとんどのユーザーがAndroid 2.1、2.2、および2.3を使用していることに依存していますが、これは残されたものです。


うん、これは戻って2012年にだった
digiphd

申し訳ありませんが、私が何を意味しているかを明確にさせてください。2015
sudocoder

69

私はすべての可能な「解決策」を試しましたが失敗しました。ElliottHughesの「Dalvik Explorer」アプリは、どのAndroidデバイス/ OSバージョンでも常に正しい寸法を表示することに気付きました。私は、https//code.google.com/p/enh/にある彼のオープンソースプロジェクトを調べました

ここにすべての関連コードがあります:

WindowManager w = activity.getWindowManager();
Display d = w.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
d.getMetrics(metrics);
// since SDK_INT = 1;
widthPixels = metrics.widthPixels;
heightPixels = metrics.heightPixels;
try {
    // used when 17 > SDK_INT >= 14; includes window decorations (statusbar bar/menu bar)
    widthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(d);
    heightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(d);
} catch (Exception ignored) {
}
try {
    // used when SDK_INT >= 17; includes window decorations (statusbar bar/menu bar)
    Point realSize = new Point();
    Display.class.getMethod("getRealSize", Point.class).invoke(d, realSize);
    widthPixels = realSize.x;
    heightPixels = realSize.y;
} catch (Exception ignored) {
}

編集:わずかに改善されたバージョン(サポートされていないOSバージョンでの例外の発生を回避):

WindowManager w = activity.getWindowManager();
Display d = w.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
d.getMetrics(metrics);
// since SDK_INT = 1;
widthPixels = metrics.widthPixels;
heightPixels = metrics.heightPixels;
// includes window decorations (statusbar bar/menu bar)
if (Build.VERSION.SDK_INT >= 14 && Build.VERSION.SDK_INT < 17)
try {
    widthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(d);
    heightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(d);
} catch (Exception ignored) {
}
// includes window decorations (statusbar bar/menu bar)
if (Build.VERSION.SDK_INT >= 17)
try {
    Point realSize = new Point();
    Display.class.getMethod("getRealSize", Point.class).invoke(d, realSize);
    widthPixels = realSize.x;
    heightPixels = realSize.y;
} catch (Exception ignored) {
}

9
これは、ウィンドウの装飾(ステータスバー/メニューバー)を考慮した唯一の投稿です。私にとってはうまくいきました。
アンディコクラン2013年

5
すばらしいですが、ビジネスロジックで例外が発生することはありません。例外の発生(キャッチされた場合でも)はパフォーマンスにとって恐ろしいものです。さらに、SDK_INTが13より大きい場合は、必要以上の作業を行っています。代わりに、Build.VERSION.SDK_INTにifsを追加するだけです。
エリックB

3
@エリックB、同意する。改良版を追加しました。それでも、try / catchで何か問題が発生した場合に備えて、「SDK 1以降」の部分は残しました(特に、何か問題が発生する可能性がないため、安全を確保したいので、Androidで多くの悪いことを見てきました:)) 。とにかく、この計算は1度だけ実行する必要があるため(たとえば、値が一部の静的属性に保持される可能性があるため)、オーバーヘッドが過度に変化することはありません。
DraganMarjanović2013年

8
このコードはGPL v3の下でライセンスされていることに注意してください。これは、本番環境アプリでの使用に影響を与えます。
TalkLittle 2013

GPLと、リフレクションに依存して、将来のAndroidバージョンには存在しない可能性があるメソッドを呼び出します。Mhhh
ミシェル

47

最も簡単な方法:

 int screenHeight = getResources().getDisplayMetrics().heightPixels;
 int screenWidth = getResources().getDisplayMetrics().widthPixels; 

46

Androidデバイスのステータスバーの高さにアクセスするには、プログラムで取得する方法をお勧めします。

サンプルコード

int resId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resId > 0) {
    result = getResources().getDimensionPixelSize(resId);
}

変数resultはピクセルの高さを与えます。

迅速なアクセスのために

ここに画像の説明を入力してください

高さの詳細についてはTitle barNavigation barContent View、上の親切な外観Androidデバイスの画面サイズ


ちょうど私が必要なもの!getResources().getDisplayMetrics().heightPixels + result実際のフルスクリーンの高さを与えます。DraganMarjanovićの答えも機能しますが、私はこれよりはるかに短くて簡単な解決策を好みます。
ミシェル

このアプローチは、Android Marshmallowの時点で古くなっています。ステータスバーの高さは、デバイスまたはAndroidのバージョンによって異なる場合があります。よく使うOnApplyWindowInsetsListener
ハインリヒ

32

最初にビューを取得します(例:)findViewById()次に、ビュー自体にgetWidth()を使用できます。


3
これは実際にドキュメントがそれを行うように指示する方法です...しかし、ビューを使用していない場合、それはちょっと無意味です。mglsurfaceviewなど、他のものを使用している可能性があります。
gcb 2010年

2
親ビューはディスプレイのサイズではない可能性があるため、これはより良い方法です。ただし、これは、サイズを照会しているビューが既にレイアウトされているポイントで行われることを確認してください。通常は、onCreate()内にはありません。onWindowFocusChanged(boolean hasFocus)からのカスタムコールバックを使用できます。これは、すべてのビューが測定された後などに呼び出され、関心のあるビューの誤ったサイズを受信しないようにします...
Dori

27

私には2つの関数があります。1つはコンテキストを送信するための関数で、もう1つはピクセルで高さと幅を取得するための関数です。

public static int getWidth(Context mContext){
    int width=0;
    WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();
    if(Build.VERSION.SDK_INT>12){
        Point size = new Point();
        display.getSize(size);
        width = size.x;
    }
    else{
        width = display.getWidth();  // Deprecated
    }
    return width;
}

そして

public static int getHeight(Context mContext){
    int height=0;
    WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();
    if(Build.VERSION.SDK_INT>12){
        Point size = new Point();
        display.getSize(size);
        height = size.y;
    }
    else{
        height = display.getHeight();  // Deprecated
    }
    return height;
}

@SuppressLint("NewApi")コンパイルできるようにするには、関数のシグネチャのすぐ上に追加する必要があります。
Adil Malik

APIを個別に呼び出すよりも、高さと幅を一度に取得する方が良いと思います。そうしないと、非同期になる可能性があります。これは、コードの実行中に画面の向きが変化した場合に発生する可能性があります。
サム

17

XMLを使用して動的にスケーリングするために、「android:layout_weight」という属性があります

このスレッドの synicの応答から変更された以下の例は、画面の75%を占めるボタン(ウェイト= .25)と、画面の残りの25%を占めるテキストビュー(ウェイト= .75)を示しています。

<LinearLayout android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <Button android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight=".25"
        android:text="somebutton">

    <TextView android:layout_width="fill_parent"
        android:layout_height="Wrap_content"
        android:layout_weight=".75">
</LinearLayout>

17

これは私がタスクに使用するコードです:

// `activity` is an instance of Activity class.
Display display = activity.getWindowManager().getDefaultDisplay();
Point screen = new Point();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
    display.getSize(screen);
} else {            
    screen.x = display.getWidth();
    screen.y = display.getHeight();
}

十分にクリーンであるように見えますが、非推奨の面倒を見てくれます。


17

これははるかに良い解決策ではありませんか?DisplayMetricsには必要なものがすべて付属しており、API 1から機能します。

public void getScreenInfo(){
    DisplayMetrics metrics = new DisplayMetrics();
    getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);

    heightPixels = metrics.heightPixels;
    widthPixels = metrics.widthPixels;
    density = metrics.density;
    densityDpi = metrics.densityDpi;
}

getRealMetricsを使用して実際の表示(ステータスバーやソフトウェアナビゲーションバーなどの画面装飾を含む)を取得することもできますが、これは17以上でのみ機能します。

何か不足していますか?


1
画面上のコントロール(タブレットやNexus端末など)のスペースを差し引くものではありません。また、計算が完了したときにアクティビティがアクティブかどうかに応じて、10インチタブレットで異なる値(750と800)を取得します。ただし、私の目的にはこれで十分です。ありがとう!
Steven L

15

フランチェスコの答えに追加するだけです。ウィンドウ内の位置または画面内の位置を確認する場合は、より適切なもう1つのオブザーバーは ViewTreeObserver.OnPreDrawListener()です。

これはまた、onCreate()時にほとんど不明なビューの他の属性(スクロールされた位置、スケーリングされた位置など)を見つけるためにも使用できます。


15

アクティビティで次のコードを使用します。

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

15

画面の幅と高さを見つける:

width = getWindowManager().getDefaultDisplay().getWidth();
height = getWindowManager().getDefaultDisplay().getHeight();

これを使用して、最新の上記のSDK 13を取得できます。

// New width and height
int version = android.os.Build.VERSION.SDK_INT;
Log.i("", " name == "+ version);
Display display = getWindowManager().getDefaultDisplay();
int width;
if (version >= 13) {
    Point size = new Point();
    display.getSize(size);
    width = size.x;
    Log.i("width", "if =>" +width);
}
else {
    width = display.getWidth();
    Log.i("width", "else =>" +width);
}


12

これでうまくいくことがわかりました。

Rect dim = new Rect();
getWindowVisibleDisplayFrame(dim);

5
クールですが、ソースコードでこのメソッドについて怖いことが1つあります。このコメント
Norbert

12

言うまでもありませんがActivity、にいない場合View(またはViewスコープに型の変数がある場合)、を使用する必要はありませんWINDOW_SERVICE。次に、少なくとも2つの方法を使用できます。

最初:

DisplayMetrics dm = yourView.getContext().getResources().getDisplayMetrics();

第二:

DisplayMetrics dm = new DisplayMetrics();
yourView.getDisplay().getMetrics(dm);

ここで呼び出すこのメソッドはすべて非推奨ではありません。


12
public class AndroidScreenActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        String str_ScreenSize = "The Android Screen is: "
                                   + dm.widthPixels
                                   + " x "
                                   + dm.heightPixels;

        TextView mScreenSize = (TextView) findViewById(R.id.strScreenSize);
        mScreenSize.setText(str_ScreenSize);
    }
}

11

画面のサイズを取得するには、表示メトリックを使用します

DisplayMetrics displayMetrics = new DisplayMetrics();
if (context != null) 
      WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
      Display defaultDisplay = windowManager.getDefaultDisplay();
      defaultDisplay.getRealMetrics(displayMetrics);
    }

高さと幅をピクセル単位で取得します

int width  =displayMetrics.widthPixels;
int height =displayMetrics.heightPixels;

9

これはOPの答えではありません。実際のピクセルでの表示サイズが必要だったためです。私は「device-independent-pixels」の寸法を望んでおり、ここhttps://stackoverflow.com/a/17880012/253938およびここhttps://stackoverflow.com/a/6656774/253938からの回答をまとめましたこれとともに:

    DisplayMetrics displayMetrics = Resources.getSystem().getDisplayMetrics();
    int dpHeight = (int)(displayMetrics.heightPixels / displayMetrics.density + 0.5);
    int dpWidth = (int)(displayMetrics.widthPixels / displayMetrics.density + 0.5);

9

あなたはを使用して高さのサイズを取得することができます:

getResources().getDisplayMetrics().heightPixels;

幅のサイズを使用して

getResources().getDisplayMetrics().widthPixels; 

8

DisplayMetrics(API 1)を使用してこれを行う非推奨の方法があります。これにより、try / catchの煩雑さを回避できます。

 // initialize the DisplayMetrics object
 DisplayMetrics deviceDisplayMetrics = new DisplayMetrics();

 // populate the DisplayMetrics object with the display characteristics
 getWindowManager().getDefaultDisplay().getMetrics(deviceDisplayMetrics);

 // get the width and height
 screenWidth = deviceDisplayMetrics.widthPixels;
 screenHeight = deviceDisplayMetrics.heightPixels;

8

getSizeコードを次のようにラップします。

@SuppressLint("NewApi")
public static Point getScreenSize(Activity a) {
    Point size = new Point();
    Display d = a.getWindowManager().getDefaultDisplay();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        d.getSize(size);
    } else {
        size.x = d.getWidth();
        size.y = d.getHeight();
    }
    return size;
}

これは、Android 4.0(API 14)を実行しているエミュレーターでクラッシュします。
jww

6

ステータスバーアクションバーなしで使用可能な画面ディメンションを検索しているユーザー(Swapnilの回答のおかげでも):

DisplayMetrics dm = getResources().getDisplayMetrics();
float screen_w = dm.widthPixels;
float screen_h = dm.heightPixels;

int resId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resId > 0) {
    screen_h -= getResources().getDimensionPixelSize(resId);
}

TypedValue typedValue = new TypedValue();
if(getTheme().resolveAttribute(android.R.attr.actionBarSize, typedValue, true)){
    screen_h -= getResources().getDimensionPixelSize(typedValue.resourceId);
}

6

最初にXMLファイルをロードしてから、次のコードを記述します。

setContentView(R.layout.main);      
Display display = getWindowManager().getDefaultDisplay();
final int width = (display.getWidth());
final int height = (display.getHeight());

画面の解像度に応じて幅と高さを表示します。


6

以下の方法に従ってください:

public static int getWidthScreen(Context context) {
    return getDisplayMetrics(context).widthPixels;
}

public static int getHeightScreen(Context context) {
    return getDisplayMetrics(context).heightPixels;
}

private static DisplayMetrics getDisplayMetrics(Context context) {
    DisplayMetrics displayMetrics = new DisplayMetrics();
    WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    wm.getDefaultDisplay().getMetrics(displayMetrics);
    return displayMetrics;
}

6

コトリン

fun getScreenHeight(activity: Activity): Int {
    val metrics = DisplayMetrics()
    activity.windowManager.defaultDisplay.getMetrics(metrics)
    return metrics.heightPixels
}

fun getScreenWidth(activity: Activity): Int {
    val metrics = DisplayMetrics()
    activity.windowManager.defaultDisplay.getMetrics(metrics)
    return metrics.widthPixels
}

5

アクティビティのonCreateでレイアウトに使用できるスペースの正確な寸法を知る必要がある場合があります。いくつか考えた後、私はこの方法でそれを実現しました。

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        startActivityForResult(new Intent(this, Measure.class), 1);
        // Return without setting the layout, that will be done in onActivityResult.
    }

    @Override
    protected void onActivityResult (int requestCode, int resultCode, Intent data) {
        // Probably can never happen, but just in case.
        if (resultCode == RESULT_CANCELED) {
            finish();
            return;
        }
        int width = data.getIntExtra("Width", -1);
        // Width is now set to the precise available width, and a layout can now be created.            ...
    }
}

public final class Measure extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
       // Create a LinearLayout with a MeasureFrameLayout in it.
        // Just putting a subclass of LinearLayout in works fine, but to future proof things, I do it this way.
        LinearLayout linearLayout = new LinearLayout(this);
        LinearLayout.LayoutParams matchParent = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
        MeasureFrameLayout measureFrameLayout = new MeasureFrameLayout(this);
        measureFrameLayout.setLayoutParams(matchParent);
        linearLayout.addView(measureFrameLayout);
        this.addContentView(linearLayout, matchParent);
        // measureFrameLayout will now request this second activity to finish, sending back the width.
    }

    class MeasureFrameLayout extends FrameLayout {
        boolean finished = false;
        public MeasureFrameLayout(Context context) {
            super(context);
        }

        @SuppressLint("DrawAllocation")
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            if (finished) {
                return;
            }
            finished = true;
            // Send the width back as the result.
            Intent data = new Intent().putExtra("Width", MeasureSpec.getSize(widthMeasureSpec));
            Measure.this.setResult(Activity.RESULT_OK, data);
            // Tell this activity to finish, so the result is passed back.
            Measure.this.finish();
        }
    }
}

なんらかの理由で別のアクティビティをAndroidマニフェストに追加したくない場合は、次の方法で行うことができます。

public class MainActivity extends Activity {
    static Activity measuringActivity;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        Bundle extras = getIntent().getExtras();
        if (extras == null) {
            extras = new Bundle();
        }
        int width = extras.getInt("Width", -2);
        if (width == -2) {
            // First time in, just start another copy of this activity.
            extras.putInt("Width", -1);
            startActivityForResult(new Intent(this, MainActivity.class).putExtras(extras), 1);
            // Return without setting the layout, that will be done in onActivityResult.
            return;
        }
        if (width == -1) {
            // Second time in, here is where the measurement takes place.
            // Create a LinearLayout with a MeasureFrameLayout in it.
            // Just putting a subclass of LinearLayout in works fine, but to future proof things, I do it this way.
            LinearLayout linearLayout = new LinearLayout(measuringActivity = this);
            LinearLayout.LayoutParams matchParent = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
            MeasureFrameLayout measureFrameLayout = new MeasureFrameLayout(this);
            measureFrameLayout.setLayoutParams(matchParent);
            linearLayout.addView(measureFrameLayout);
            this.addContentView(linearLayout, matchParent);
            // measureFrameLayout will now request this second activity to finish, sending back the width.
        }
    }

    @Override
    protected void onActivityResult (int requestCode, int resultCode, Intent data) {
        // Probably can never happen, but just in case.
        if (resultCode == RESULT_CANCELED) {
            finish();
            return;
        }
        int width = data.getIntExtra("Width", -3);
        // Width is now set to the precise available width, and a layout can now be created. 
        ...
    }

class MeasureFrameLayout extends FrameLayout {
    boolean finished = false;
    public MeasureFrameLayout(Context context) {
        super(context);
    }

    @SuppressLint("DrawAllocation")
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        if (finished) {
            return;
        }
        finished = true;
        // Send the width back as the result.
        Intent data = new Intent().putExtra("Width", MeasureSpec.getSize(widthMeasureSpec));
        MainActivity.measuringActivity.setResult(Activity.RESULT_OK, data);
        // Tell the (second) activity to finish.
        MainActivity.measuringActivity.finish();
    }
}    

もちろん、バンドルの高さを戻すこともできます。
Steve Waring 2013年

5

WindowManagers、Points、またはDisplaysのオーバーヘッドが必要ない場合は、XMLの最上位のViewアイテムの高さと幅の属性を取得できます(高さと幅がmatch_parentに設定されている場合)。(これは、レイアウトが画面全体を占める限り当てはまります。)

たとえば、XMLが次のようなもので始まる場合:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/entireLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

次にfindViewById(R.id.entireLayout).getWidth()、画面の幅findViewById(R.id.entireLayout).getHeight()を返し、画面の高さを返します。

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