EditTextでソフトキーボードが表示または非表示になったイベントをキャッチすることはできますか?
こんにちは私は次の回避策を使用しました:
私のコンテンツビューがLinearLayoutのサブクラスである限り(他のビューまたはビューグループである可能性があります)、onMeasureメソッドを次のようにオーバーライドしました:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
final int proposedheight = MeasureSpec.getSize(heightMeasureSpec);
final int actualHeight = getHeight();
if (actualHeight > proposedheight){
// Keyboard is shown
} else {
// Keyboard is hidden
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
この回避策は、キーボードが表示されているときに一部のコントロールを非表示にし、それ以外の場合に戻すのに役立ちました。
これが役に立つことを願っています。
実際にキャッチするようなイベントはありません。 IMEは、単にウィンドウを表示および非表示にしています。これから得られるフィードバックは、サイズ変更モードにした場合、独自のウィンドウのコンテンツのサイズを変更するウィンドウマネージャーです。
OnGlobalLayoutListenerを使用してこの問題を解決しました。
final View activityRootView = findViewById(R.id.top_root);
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
public void onGlobalLayout() {
int heightDiff = activityRootView.getRootView().getHeight() - activityRootView.getHeight();
if (heightDiff > 100) {
// keyboard is up
} else {
// keyboard is down
}
}
});
ここで、activityRootViewはアクティビティのルートビューです。
私の場合、ソフトキーボードが表示されたときに下のバーを非表示にしたかった。レイアウトのサイズが通常のレイアウトサイズの1パーセント未満の場合は、バーを非表示にするのが最善と考えました。そこで、ソフトキーボードの画面の高さは通常20%以上になることを考慮して、このソリューションを使用しました。あなたが大丈夫だと思うかもしれないどんな値でもパーセント定数を変えるだけです。マニフェスト内の属性Android:windowSoftInputMode = "adjustResize"が必要です。機能するにはレイアウトがルートである必要があります。
RelativeLayoutの代わりに、必要なレイアウトから拡張します。
public class SoftKeyboardLsnedRelativeLayout extends RelativeLayout {
private boolean isKeyboardShown = false;
private List<SoftKeyboardLsner> lsners=new ArrayList<SoftKeyboardLsner>();
private float layoutMaxH = 0f; // max measured height is considered layout normal size
private static final float DETECT_ON_SIZE_PERCENT = 0.8f;
public SoftKeyboardLsnedRelativeLayout(Context context) {
super(context);
}
public SoftKeyboardLsnedRelativeLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
@SuppressLint("NewApi")
public SoftKeyboardLsnedRelativeLayout(Context context, AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
final int newH = MeasureSpec.getSize(heightMeasureSpec);
if (newH > layoutMaxH) {
layoutMaxH = newH;
}
if (layoutMaxH != 0f) {
final float sizePercent = newH / layoutMaxH;
if (!isKeyboardShown && sizePercent <= DETECT_ON_SIZE_PERCENT) {
isKeyboardShown = true;
for (final SoftKeyboardLsner lsner : lsners) {
lsner.onSoftKeyboardShow();
}
} else if (isKeyboardShown && sizePercent > DETECT_ON_SIZE_PERCENT) {
isKeyboardShown = false;
for (final SoftKeyboardLsner lsner : lsners) {
lsner.onSoftKeyboardHide();
}
}
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
public void addSoftKeyboardLsner(SoftKeyboardLsner lsner) {
lsners.add(lsner);
}
public void removeSoftKeyboardLsner(SoftKeyboardLsner lsner) {
lsners.remove(lsner);
}
// Callback
public interface SoftKeyboardLsner {
public void onSoftKeyboardShow();
public void onSoftKeyboardHide();
}
}
例:
layout/my_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<yourclasspackage.SoftKeyboardLsnedRelativeLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/myLayout"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
...
</yourclasspackage.SoftKeyboardLsnedRelativeLayout>
MyActivity.Java
public class MyActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_layout);
SoftKeyboardLsnedRelativeLayout layout = (SoftKeyboardLsnedRelativeLayout) findViewById(R.id.myLayout);
layout.addSoftKeyboardLsner(new SoftKeyboardLsner() {
@Override
public void onSoftKeyboardShow() {
Log.d("SoftKeyboard", "Soft keyboard shown");
}
@Override
public void onSoftKeyboardHide() {
Log.d("SoftKeyboard", "Soft keyboard hidden");
}
});
}
}
次のメソッドを試してください:showSoftInput(View, int, ResultReceiver)
およびhideSoftInputFromWindow(IBinder, int, ResultReceiver)
。 ResultReceiver
クラスのonReceiveResult(int resultCode, Bundle resultData)
メソッドをオーバーライドして、show/hideイベントを処理できます。
多くのAndroid開発者は、仮想キーボードが表示されるかどうかに基づいてレイアウトを変更するのが好きです。そのため、ソリューションについては、 Android:Detect softkeyboard open 。and it私のために働いており、私もそれがとても便利だと思います。