Подтвердить что ты не робот

Нажмите внешний редактор, чтобы потерять фокус

Я просто хочу, когда вы нажимаете "edittext", чтобы автоматически потерять фокус и скрыть клавиатуру. На данный момент, если я нажимаю на "edittext", он фокусируется, но мне нужно нажать кнопку "Назад", чтобы не сфокусироваться.

4b9b3361

Ответ 1

Чтобы решить эту проблему, сначала нужно использовать setOnFocusChangeListener этого Edittext

edittext.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (!hasFocus) {
                    Log.d("focus", "focus lost");
                    // Do whatever you want here
                } else {
                    Log.d("focus", "focused");
                }
            }
        });

и тогда вам нужно переопределить dispatchTouchEvent в действии, которое содержит этот Edittext, см. код ниже

@Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            View v = getCurrentFocus();
            if ( v instanceof EditText) {
                Rect outRect = new Rect();
                v.getGlobalVisibleRect(outRect);
                if (!outRect.contains((int)event.getRawX(), (int)event.getRawY())) {
                    Log.d("focus", "touchevent");
                    v.clearFocus();
                    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
                }
            }
        }
        return super.dispatchTouchEvent(event);
    }

Теперь произойдет, когда пользователь щелкнет снаружи, во-первых, будет вызван этот dispatchTouchEvent, который затем очистит фокус от editext, теперь ваш OnFocusChangeListener будет вызван, что фокус был изменен, теперь вы можете делать все, что хотел сделать, надеюсь, что это работает :)

Ответ 2

@woodshy имеет ответ на скрытие клавиатуры, но, возможно, поместить код в onClick не так хорошо, как положить его в onFocusChanged. Что касается того, чтобы заставить его потерять фокус, вам нужно установить объект, в который вы хотите перенести фокус, в его XML файл:

android:focusable="true"
android:focusableInTouchMode ="true"

Ответ 3

Предположим, что ваш EditText помещен в Linear layout или другую ViewGroup. Затем вы должны сделать этот контейнер доступным, настраиваемым и focusableInTouchMode. После этого установите onClickListener в этот контейнер со следующим кодом в методе OverClick Override:

@Override
public void onClick(View view) {
    InputMethodManager imm = (InputMethodManager) view.getContext()
            .getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

Ответ 4

Итак, я немного искал, и никакие другие решения не были именно тем, что я искал. На мой взгляд, фокус ведет себя странно к представлениям EditText.

То, что я сделал, было...

  • Убедитесь, что корневой вид является RelativeLayout

  • Добавьте накладной макет, который находится поверх области, которая заставит клавиатуру исчезнуть, но не EditText. Что-то вроде ниже:

В моем случае EditText находился в контейнере в нижней части экрана. поэтому он охватывал все остальные.

  1. Имейте метод, который немного похож на этот:
    private void hideKeyboard() {
        final InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
        keyboardOverlay.setVisibility(View.GONE);
        editText.clearFocus();
    }
  1. Теперь вызовите этот метод в onClick созданного вами оверлея.

  2. Теперь мы хотим сделать наложение видимым, когда вы нажимаете на editText. Вы не можете использовать событие onFocus (по крайней мере, я не получил его для работы...) Итак, что я сделал, мне удалось выполнить событие onTouch.

editText.setOnTouchListener(new OnTouchListener() {

    @Override
    public boolean onTouch(final View v, final MotionEvent event) {
        keyboardOverlay.setVisibility(View.VISIBLE);
        editText.requestFocus();
        return false;
    }
});

RequestFocus() здесь должен не переопределять событие фокусировки с помощью onTouch.

Быстрый совет, когда вы попробуете это, вы можете добавить цвет фона на оверлей, чтобы точно увидеть, что происходит.

Надеюсь, что это сработает для вас!

Ответ 5

Вы можете достичь этого, выполнив следующие действия:

1. Сделайте родительский вид (контентный вид вашей деятельности) кликабельным и фокусируемым, добавив следующие атрибуты

    android:clickable="true" 
    android:focusableInTouchMode="true" 

2. Внедрить метод hideKeyboard()

    public void hideKeyboard(View view) {
        InputMethodManager inputMethodManager =(InputMethodManager)getSystemService(Activity.INPUT_METHOD_SERVICE);
        inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
    }

3. Наконец, установите onFocusChangeListener вашего текста редактирования.

    edittext.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {
                hideKeyboard(v);
            }
        }
    });

Ответ 6

Следующий код отлично работает для меня, и я регулярно использую его для закрытия SoftKeyboard onTouch в любом месте вне EditText.

public void hideSoftKeyboard()
{
        //Hides the SoftKeyboard
        InputMethodManager inputMethodManager = (InputMethodManager)  getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE);
        inputMethodManager.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), 0);
}

public void setupUI(View view) 
{
        String s = "inside";
        //Set up touch listener for non-text box views to hide keyboard.
        if (!(view instanceof EditText)) {

            view.setOnTouchListener(new View.OnTouchListener() {

                public boolean onTouch(View v, MotionEvent event) {
                    hideSoftKeyboard();
                    return false;
                }

            });        
        }


    //If a layout container, iterate over children and seed recursion.
        if (view instanceof ViewGroup) {

            for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {

                View innerView = ((ViewGroup) view).getChildAt(i);

                setupUI(innerView);
            }
        }    
}

Итак, вам просто нужно вызвать функцию setupUI() один раз в вашем методе onCreate() и voilla, ваш hidingSoftKeyboard настроен!

Для Потеря полного фокуса в EditText просто выполните editText.clearFocus() в вашей функции hideSoftKeyboard().

Ответ 7

установить в кнопке или в любом представлении: this.getCurrentFocus(). clearFocus(); Например:

@Override
public boolean onMenuOpened(int featureId, Menu menu) {
    InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
    this.getCurrentFocus().clearFocus();
    return super.onMenuOpened(featureId, menu);
}

Ответ 8

У меня было то же требование, что и мне пришлось скрывать клавиатуру, когда я касаюсь где-либо вне моего окна EditText. setOnFocusChangeListener не выполняет эту работу, даже если вы касаетесь вне текстового поля редактирования.

Для этого я использовал решение edc598 здесь.

  • Сначала я получил MainLayout, содержащий весь вид, и добавлю к нему приходящего прослушивателя.
  • Когда событие onTouch было запущено, я проверяю, имеет ли блок EditText фокус.
  • Если в окне EditText есть фокус, я проверяю координаты X-Y события.
  • Основываясь на размещении моего окна EditText, я спрячу клавиатуру, если ее коснутся вне коробки.

Пример кода, измененный здесь:

LinearLayout MainLayout = (LinearLayout) findViewById(R.id.MainLayout);
EditText textBox        = (EditText) findViewById(R.id.textBox);   
int X_TOP_LEFT      = 157;
int Y_TOP_LEFT      = 388;
int X_BOTTOM_RIGHT  = 473;
int Y_BOTTOM_RIGHT  = 570;   
MainLayout.setOnTouchListener(new View.OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // TODO Auto-generated method stub
        if(textBox.isFocused()){

            Log.i("Focussed", "--" + event.getX() + " : " + event.getY() + "--");

            if(event.getX() <= 157 || event.getY() <= 388 || event.getX() >= 473 || event.getY() >= 569){
                //Will only enter this if the EditText already has focus
                //And if a touch event happens outside of the EditText
                textBox.clearFocus();
                InputMethodManager imm = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
                //Do something else
            }
        }
        Log.i("X-Y coordinate", "--" + event.getX() + " : " + event.getY() + "--");
    //Toast.makeText(getBaseContext(), "Clicked", Toast.LENGTH_SHORT).show();
        return false;
    }
});