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で理想的に機能するために必要です。
実用的な解決策:
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
参照元:画面サイズをピクセル単位で取得
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/root
xmlレイアウトの親に。レイアウトがビューに配置されるたびにこのリスナーがコールバックを行うため、サイズが0の結果を返す方法はありません。
表示用
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;
}
別の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;
Display currentDisplay = getWindowManager().getDefaultDisplay();
float dw = currentDisplay.getWidth();
float dh = currentDisplay.getHeight();
dh
は画面の高さを示します。
あなたの質問に答えられないかもしれませんが、ビューの寸法が必要であるが、レイアウトがまだレイアウトされていないときにコードが実行されている場合は(この質問に来たときに自分で探していました)知っておくと便利です。 (たとえば、onCreate()で)View.getViewTreeObserver()。addOnGlobalLayoutListener()を使用してViewTreeObserver.OnGlobalLayoutListenerをセットアップし、そこにビューのディメンションを必要とする関連コードを配置できます。レイアウトがレイアウトされると、リスナーのコールバックが呼び出されます。
礼儀-フランチェスコフェルトリネッリ
あなたはこれを試みることができます。
サブクラス化されたビューをアクティビティのルートとして設定するのはどうですか。このビューを画面全体に表示し(ステータスバーを通過しません)、オーバーライドします onSizeChanged() 。それらの値を保存し、それらのゲッターを作成します。
アクティビティによってロードされるルートレイアウトの高さを取得します。画面がいっぱいにならない場合は、heightプロパティがfill_parentの別のレイアウト内に配置します。