web-dev-qa-db-ja.com

Android EditText、ソフトキーボードの表示/非表示イベント?

EditTextでソフトキーボードが表示または非表示になったイベントをキャッチすることはできますか?

44
shkim

こんにちは私は次の回避策を使用しました:

私のコンテンツビューが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);
}

この回避策は、キーボードが表示されているときに一部のコントロールを非表示にし、それ以外の場合に戻すのに役立ちました。

これが役に立つことを願っています。

29
woodshy

実際にキャッチするようなイベントはありません。 IMEは、単にウィンドウを表示および非表示にしています。これから得られるフィードバックは、サイズ変更モードにした場合、独自のウィンドウのコンテンツのサイズを変更するウィンドウマネージャーです。

18
hackbod

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はアクティビティのルートビューです。

4
Varun Verma

私の場合、ソフトキーボードが表示されたときに下のバーを非表示にしたかった。レイアウトのサイズが通常のレイアウトサイズの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");
            }
        });
    }
}
2
Lolme

次のメソッドを試してください:showSoftInput(View, int, ResultReceiver)およびhideSoftInputFromWindow(IBinder, int, ResultReceiver)ResultReceiverクラスのonReceiveResult(int resultCode, Bundle resultData)メソッドをオーバーライドして、show/hideイベントを処理できます。

1
single-minded

多くのAndroid開発者は、仮想キーボードが表示されるかどうかに基づいてレイアウトを変更するのが好きです。そのため、ソリューションについては、 Android:Detect softkeyboard open 。and it私のために働いており、私もそれがとても便利だと思います。

0
John smith