Androidで、端末に表示されている仮想キーボードの高さをランタイムで取得する方法はありますか?実は、キーボードの上にテキストボックスを表示させたいのです。
Viewtree Observerとグローバルレイアウトリスナーの助けを借りて、以下のステップを試してみてください。
1.レイアウトのルートビューを取得する 2. このルートの Viewtree オブザーバを取得し、その上にグローバルレイアウトリスナーを追加します。
これで、ソフトキーボードが表示されるたびに、アンドロイドは画面のサイズを変更し、リスナーへの呼び出しを受けることになります。それはあなたが今行う必要がある唯一のものは、あなたのルートビューは、リサイズ後に持っている高さと元のサイズとの間の差を計算しています。もし差が150以上あれば、キーボードが膨張していると考えてください。
以下はサンプルコードです。
root.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener(){
public void onGlobalLayout(){
int heightDiff = root.getRootView().getHeight()- root.getHeight();
// IF height diff is more then 150, consider keyboard as visible.
}
});
おことわり テックフィスト
私の解決策は、上記のすべての解決策を組み合わせたものです。この解決策もまた厄介なものですが、(少なくとも私にとっては)問題を解決することができます。
1.画面の下に透明な背景を持つ一時的なビューを配置しています。
2.2. @billさんのおっしゃるとおり、マニフェストのアクティビティタグに、android:windowSoftInputMode="adjustResize"フラグを追加しています。 3.3. さて、本題は
onGlobalLayout()` にあります。そこで、temp viewのY軸とroot viewの高さの差を計算します。
final View view = findViewById(R.id.base);
view.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {)
オーバーライド
public void onGlobalLayout() { (パブリックボイドオングローバルレイアウト)
int rootViewHeight = view.getRootView().getHeight();
View tv = findViewById(R.id.temp_view);
int location[] = new int[2];
tv.getLocationOnScreen(location)を実行します。
int height = (int) (location[1] + tv.getMeasuredHeight());
deff = rootViewHeight - height;
// deffはソフトキーボードの高さです。
}
});
しかし、@zeeshan0026 の問題を解決するには、とにかくマニフェストに android:windowSoftInputMode="adjustResize"
というフラグを1つだけ入れれば十分なのです。