1. ホーム
  2. android

[解決済み] EditText、外部タッチでフォーカスをクリアする

2022-08-13 01:54:08

質問

私のレイアウトには ListView , SurfaceViewEditText . をクリックすると EditText をクリックすると、フォーカスを得て、画面上のキーボードがポップアップ表示されます。の外をクリックすると EditText の外側をクリックすると、まだフォーカスがあります(そうでないはずです)。 私は OnTouchListener を設定し、手動で EditText のフォーカスを手動でクリアします。しかし、あまりにもハッキングのように思える...

私はまた、別のレイアウトで同じ状況を持っています。異なるタイプのアイテムを持つリストビューで、そのうちのいくつかは EditText を持つものもあります。それらは私が上で書いたのと同じように動作します。

タスクは EditText がフォーカスを失うようにすることです。

私はここで同じような質問を見ましたが、解決策は見つかりませんでした...。

どのように解決するのですか?

私はこれらの解決策をすべて試しました。 edc598のものが最も動作に近かったのですが、タッチイベントが他の View にはタッチ イベントがトリガーされませんでした。誰かがこの動作を必要とする場合に備えて、これは私が最終的に行ったことです。

私は(見えない) FrameLayout という touchInterceptor を最後の View を配置することで、すべてのレイアウトに重なるようにします ( を編集します。 を使用する場合は RelativeLayout を親レイアウトとして使用し touchInterceptor fill_parent 属性) を使用しています。次に、これを使用して、タッチをインターセプトし、タッチが EditText の上にあるかどうかを判断するために使用します。

FrameLayout touchInterceptor = (FrameLayout)findViewById(R.id.touchInterceptor);
touchInterceptor.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            if (mEditText.isFocused()) {
                Rect outRect = new Rect();
                mEditText.getGlobalVisibleRect(outRect);
                if (!outRect.contains((int)event.getRawX(), (int)event.getRawY())) {
                    mEditText.clearFocus();
                    InputMethodManager imm = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); 
                    imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
                }
            }
        }
        return false;
    }
});

タッチ操作のフォールスルーにはfalseを返す。

ハチャメチャですが、私の場合はこれだけで大丈夫でした。