web-dev-qa-db-ja.com

画面の高さをAndroid

Androidで利用可能な画面の高さを取得するにはどうすればよいですか?高さからステータスバー/メニューバーまたは画面に表示される可能性のあるその他の装飾を差し引いたものが必要であり、すべてのデバイスで機能する必要があります。また、onCreate関数でこれを知る必要があります。私はこの質問が以前に尋ねられたことを知っていますが、私はすでに彼らの解決策を試しました、そしてそれらのどれもうまくいきません。これが私が試したことのいくつかです:

このコードをAPI7-17でテストしました。残念ながら、API 13では、水平方向と垂直方向の両方で下部に余分なスペースがあり、API 10、8、および7では、水平方向と垂直方向の両方で下部に十分なスペースがありません。 (私は廃止されたAPIでテストしていません):

Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
display.getMetrics(metrics);
screenWidth = metrics.widthPixels;
screenHeight = metrics.heightPixels;

TypedValue tv = new TypedValue();
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
{
    if (getTheme().resolveAttribute(Android.R.attr.actionBarSize, tv, true))
        screenHeight -= TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
}

int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "Android");
if (resourceId > 0)
    screenHeight -= getResources().getDimensionPixelSize(resourceId);

これはステータスバー/メニューバーを考慮していません:

Display display = getWindowManager().getDefaultDisplay();
screenWidth = display.getWidth();
screenHeight = display.getHeight();

これもしません:

Point size = new Point();
getWindowManager().getDefaultDisplay().getSize(size);
screenWidth = size.x;
screenHeight = size.y;

これでもない:

Point size = new Point();
getWindowManager().getDefaultDisplay().getRealSize(size);
screenWidth = size.x;
screenHeight = size.y;

これは動作しません:

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

次に、次のコードを使用して、画面の高さからステータスバーとメニューバーの高さを減算しました。

int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "Android");
if (resourceId > 0)
    result = getResources().getDimensionPixelSize(resourceId);
screenHeight -= result;
result = 0;
if (screenHeight >= screenWidth)
    resourceId = getResources().getIdentifier("navigation_bar_height", "dimen", "Android");
else
    resourceId = getResources().getIdentifier("navigation_bar_height_landscape", "dimen", "Android");
if (resourceId > 0)
    result = getResources().getDimensionPixelSize(resourceId);
screenHeight -= result;

API 17では、縦向きではステータスバーとメニューバーの高さを正しく計算しますが、横向きでは計算しません。 API 10では、0を返します。すべてのデバイスまたは最小のAPI7で理想的に機能するために必要です。

18
Dan Bray

実用的な解決策:

2つのダミービューを作成します。

_ <View
    Android:id="@+id/top"
    Android:layout_height="0dp"
    Android:layout_width="match_parent"
    Android:layout_alignParentTop="true" />

<View
        Android:id="@+id/bottom"
        Android:layout_height="0dp"
        Android:layout_width="match_parent"
        Android:layout_alignParentBottom="true" />
_

ここで、これら2つのビューでgetLocationOnScreen(int [])を呼び出して、それらの場所を受け取る必要があります。この関数は、2つの整数の配列を返します。最初はxで、2番目はyです。 yだけが必要です。また、すべてのビューが作成され、onCreateメソッドが終了した後にのみ、正しい値が返されることに注意してください。

ビューページャーから呼び出される通常のフラグメントでこのコードをテストしました。

コードは私のフラグメントのonCreateViewメソッドにありました。正しい値を取得するには、まだpostDelayedを使用する必要がありました。

_final View top = (View) view.findViewById(R.id.top);
    final View bottom = (View) view.findViewById(R.id.bottom);
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {

            int topLoc[] = new int[2];
            top.getLocationOnScreen(topLoc);
            int BottomLoc[] = new int[2];
            bottom.getLocationOnScreen(BottomLoc);
            Log.d(Constants.debug, "topY: "+ topLoc[1]+" BottomY:" + BottomLoc[1]);
        }
    },4000);
_

Nexus4を持っています。

通常モードの場合(ステータスバーとソフトボタンが表示されます):

_07-05 02:28:23.367      565-565/com.torcellite.xx D/xx: topY: 50 BottomY:1182
_

フルスクリーンモードの場合(ステータスバーやソフトボタンは表示されません):

_07-05 02:29:17.360      707-707/com.torcellite.xx D/xx: topY: 0 BottomY:1280
_

あなたが今しなければならないのは引くことだけです。

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

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

Activityにいない場合は、WINDOW_SERVICEを介してデフォルトの表示を取得できます。

WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
display.getSize(size);
int width = size.x;
int height = size.y;

getSizeが導入される前(APIレベル13)は、getWidthメソッドとgetHeightメソッドを使用できましたが、現在は非推奨です:

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

参照元:画面サイズをピクセル単位で取得

6
Ponmalar
final View view = findViewById(R.id.root);
ViewTreeObserver vto = view.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        // calculate the height in here...

        ViewTreeObserver vto = view.getViewTreeObserver();
        vto.removeGlobalOnLayoutListener(this);
    }
});

このリスナーはonCreate内で使用します(API 1以降で使用可能)。 IDを割り当てる必要があります@+id/rootxmlレイアウトの親に。レイアウトがビューに配置されるたびにこのリスナーがコールバックを行うため、サイズが0の結果を返す方法はありません。

2
Carnal

表示用

DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int height = displaymetrics.heightPixels;
int width = displaymetrics.widthPixels;

ステータスバー用

public int getStatusBarHeight() {
        int result = 0;
        int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "Android");
        if (resourceId > 0) {
            result = getResources().getDimensionPixelSize(resourceId);
        }
        return result;
    }
2
Parag Chauhan

別のAPIを試したことはありませんが、これらの値を使用して、オンスクリーンキーボードが起動しているかどうかを確認しています。たぶん、これと幅に匹敵するものを試して、必要なものを手に入れることができますか?

Rect r = new Rect();
view.getWindowVisibleDisplayFrame(r);
int
    screenHeight = view.getRootView().getHeight(), // height of the entire screen
    appHeight = r.bottom - r.top, // height of the entire app
    statusBarHeight = r.top, // height of the statusbar
    pageHeight = view.getHeight(), // height of the app without title
    appTitleHeight = appHeight - pageHeight, // height of the only the app title
    topHeight = statusBarHeight + appTitleHeight;
2
Gelunox
Display currentDisplay = getWindowManager().getDefaultDisplay();
        float dw = currentDisplay.getWidth();
        float dh = currentDisplay.getHeight();

dhは画面の高さを示します。

1
Vaishali Sharma

あなたの質問に答えられないかもしれませんが、ビューの寸法が必要であるが、レイアウトがまだレイアウトされていないときにコードが実行されている場合は(この質問に来たときに自分で探していました)知っておくと便利です。 (たとえば、onCreate()で)View.getViewTreeObserver()。addOnGlobalLayoutListener()を使用してViewTreeObserver.OnGlobalLayoutListenerをセットアップし、そこにビューのディメンションを必要とする関連コードを配置できます。レイアウトがレイアウトされると、リスナーのコールバックが呼び出されます。

礼儀-フランチェスコフェルトリネッリ

あなたはこれを試みることができます。

0
pulkit gupta

サブクラス化されたビューをアクティビティのルートとして設定するのはどうですか。このビューを画面全体に表示し(ステータスバーを通過しません)、オーバーライドします onSizeChanged() 。それらの値を保存し、それらのゲッターを作成します。

0
Ryan

アクティビティによってロードされるルートレイアウトの高さを取得します。画面がいっぱいにならない場合は、heightプロパティがfill_parentの別のレイアウト内に配置します。

0
SceLus