18

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

API 7 から 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 を返します。すべてのデバイスまたは最小 API 7 で理想的に動作する必要があります。

4

9 に答える 9

7

ピクセル単位の表示サイズが必要な場合は、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

参照元: 画面の寸法をピクセル単位で取得

于 2013-07-06T05:45:30.010 に答える
2
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/rootxml レイアウトで親にID を割り当てる必要があります。レイアウトがビューに配置されるたびにこのリスナーがコールバックを行うため、サイズが 0 の結果を返すことはありません。

于 2013-07-04T09:06:42.220 に答える
1
Display currentDisplay = getWindowManager().getDefaultDisplay();
        float dw = currentDisplay.getWidth();
        float dh = currentDisplay.getHeight();

dh画面の高さになります。

于 2013-06-28T05:52:41.293 に答える
0

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

礼儀-Francesco Feltrinelli

あなたはこれをやろうとすることができます。

于 2013-07-03T13:15:56.897 に答える