2017-09-16 11 views
0

Androidのソフトボタンバーの場所を特定しようとしています(ハードウェアの戻る、メニューなどのボタンの代わりに、画面に表示されます)。Androidのソフトボタンバーの場所を見つけることはできますか?

私は

Display d = getWindowManager().getDefaultDisplay(); 
DisplayMetrics realDisplayMetrics = new DisplayMetrics(); 
DisplayMetrics displayMetrics = new DisplayMetrics(); 

d.getRealMetrics(realDisplayMetrics); 
d.getMetrics(displayMetrics); 

のようなものを持つピクセルで実際のウィンドウサイズを取得...そして、「通常」の表示メトリックあれば「本物」の表示メトリックと比較して確認する方法を知っています。 したがって、ソフトボタンバーが水平または垂直の位置にあるかどうか(およびピクセルの数)はわかりますが、左または右にあるかどうかはわかりません。

これを取得する方法はありますか?

EDIT:コードの文脈はアクティビティの中にあります(質問したとおり)。

+0

あなたが活動中でありますか? – ianhanniballake

+0

はい私は活動中です – Panayotis

+0

私のピクセルxl(8.0)では、navbarは常に携帯電話の物理的な底に向かって配置されています。少し掘り下げて、デバイス/バージョンの一貫性を確認してから、['activity.getRequestedOrientation()'](https://developer.android.com/reference/android/app/Activity.html# getRequestedOrientation())を使用して、物理的なボトムが一番左か一番右かを判断します。 – MeetTitan

答えて

2

Why would I want to fitsSystemWindows blog postで説明されているように、システムウィンドウのインセットを使用するのは、システムウィンドウの場所(ステータスバーやナビゲーションバーなど)の信頼できる唯一の指標です。

API 21より前のバージョンでは、アクティビティのルートビューがオーバーライドしたサブクラスである必要がありました。Rectはステータスバー/ナビゲーションバーのサイズとサイズを教えてくれますアクティビティに設定したフラグによって異なります)。

しかし、API 21+上で、あなたが代わりにViewCompat.setOnApplyWindowInsetsListenerを使用してカスタムビューを作成せずにこれを行うことができます:

ViewCompat.setOnApplyWindowInsetsListener(yourRootView, 
    new OnApplyWindowInsetsListener() { 
     @Override 
     public WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets) { 
     // Use insets.getSystemWindowInsetBottom(), etc to extract 
     // the size and location of the system windows 
     return ViewCompat.onApplyWindowInsets(v, insets); 
     } 
    }); 
関連する問題