Android: заставить EditText убрать фокус?

Я хотел бы иметь возможность удалить фокус из EditText. Например, если появляется клавиатура, а пользователь скрывает ее с помощью кнопки "назад", я бы хотел, чтобы фокус и курсор исчезли. Как это можно сделать?

19 ответов

Решение

Вы можете добавить это к onCreate и он будет скрывать клавиатуру при каждом запуске.

Вы также можете программно изменить фокус на другой элемент.

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

Вы можете сделать курсор и фокус исчезнуть с помощью

edittext.clearFocus();

Но определить, когда скрыть клавиатуру - тяжелая работа.

Добавлять LinearLayout до EditText в вашем XML.

<LinearLayout 
    android:focusable="true"
    android:focusableInTouchMode="true" 
    android:clickable="true"
    android:layout_width="0px"
    android:layout_height="0px" />

Или вы можете сделать то же самое, добавив эти строки для просмотра перед вашим "EditText".

<Button
    android:id="@+id/btnSearch"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:gravity="center"
    android:text="Quick Search"
    android:textColor="#fff"
    android:textSize="13sp"
    android:textStyle="bold" />

<EditText
    android:id="@+id/edtSearch"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_centerVertical="true"
    android:layout_marginRight="5dp"
    android:gravity="left"
    android:hint="Name"
    android:maxLines="1"
    android:singleLine="true"
    android:textColorHint="@color/blue"
    android:textSize="13sp"
    android:textStyle="bold" />

Уберите фокус, но оставайтесь в фокусе:

editText.setFocusableInTouchMode(false);
editText.setFocusable(false);
editText.setFocusableInTouchMode(true);
editText.setFocusable(true);

EditText потеряет фокус, но может получить его снова на новом сенсорном событии.

Добавьте эти два свойства в родительский макет (например: линейный макет, относительный макет)

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

Это сделает свое дело:)

удалить автофокус edittext android

Это работает для меня

Edit В ссылке они предлагают использовать LinearLayout, но простой View будет работать

<View
    android:id="@+id/focus_thief"
    android:layout_width="1dp"
    android:layout_height="1dp"
    android:focusable="true"
    android:focusableInTouchMode="true" />

Затем, если этот "вор" находится в верхней части макета (чтобы быть первым фокусируемым элементом), вызов clearFocus() буду работать.

Чтобы скрыть клавиатуру при запуске активности.. напишите следующий код в onCreate()..

InputMethodManager imm = (InputMethodManager)
getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);

Очистить фокус и удалить курсор из текста редактирования.....

editText.clearFocus();

editText.setCursorVisible(false);

Вы также можете включить android:windowSoftInputMode="stateAlwaysHidden" в раздел действий манифеста.

Это эквивалентно:

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

но в формате XML.

К вашему сведению, вы также можете скрыть клавиатуру с кодами:

// hide virtual keyboard
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mYourEditText.getWindowToken(), 0);

Попробуйте использовать это по вашему мнению, это сработало для меня:

<View
    android:id="@+id/fucused"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:focusable="true"
    android:focusableInTouchMode="true"/>

Добавьте в родительский макет, где вы положили EditText этот android:focusableInTouchMode="true"

Ты должен удалить <requestFocus/>

если вы не используете его и все та же проблема

пользователь LinearLayout как родитель и установить

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

Надеюсь, это поможет вам.

Это мой самый первый ответ на SO, так что не будьте слишком резкими со мной, если есть ошибки.:D

Есть несколько ответов вокруг SO, но я чувствую желание опубликовать мое полное решение, потому что это сводило меня с ума. Я взял кусочки со всех сторон, так что прости меня, если я не даю соответствующие кредиты всем...:)

(Я упросту свой результат, потому что в моем представлении слишком много элементов, и я не хочу спамить с этим и постараюсь сделать его как можно более универсальным...)

Для вашего макета вам нужен родитель, ваш EditText и родительский вид определили что-то вроде этого:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
              android:orientation="vertical"
              android:layout_width="match_parent" 
              android:layout_height="match_parent"
              android:id="@+id/lytContainer"
              android:descendantFocusability="beforeDescendants"
              android:focusableInTouchMode="true">
<EditText android:layout_width="fill_parent" 
              android:layout_height="wrap_content" 
              android:id="@+id/etEditor"
              android:inputType="number"
              android:layout_gravity="center" 
              android:hint="@string/enter_your_text"
              android:textColor="@android:color/darker_gray" 
              android:textSize="12dp"
              android:textAlignment="center" 
              android:gravity="center" 
              android:clickable="true"/>
</LinearLayout>

Итак, мне нужно было несколько вещей здесь. Мне нужно было заполнитель для моего EditText - что это такое -

Android: намек = "намек"

Также,

android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"

это сделало так, чтобы EditText не фокусировался на входе в Activity, а затем в самом Activity, когда устанавливал его, этот параметр помогает, так что вы можете установить onTouchListener для него, чтобы украсть фокус от EditText.

Теперь в Деятельности:

package com.at.keyboardhide;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.view.View.OnTouchListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.LinearLayout;

public class MainActivity extends Activity implements OnTouchListener{
private EditText getEditText;
private LinearLayout getLinearLayout;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.getWindow().setSoftInputMode(
            WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

    setContentView(R.layout.keyboardmain);
    getEditText = (EditText)findViewById(R.id.etEditor);
    getLinearLayout = (LinearLayout)findViewById(R.id.lytContainer);
    getLinearLayout.setOnTouchListener(this);

    getEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId == EditorInfo.IME_ACTION_DONE) {
                Log.d("EDTA", "text was entered.");
                getEditText.clearFocus();
                imm.hideSoftInputFromWindow(barcodeNo.getWindowToken(), 0);
                return true;
            }
            return false;
        }
    });
}
@Override
public boolean onTouch(View v, MotionEvent event) {
    if(v==getLinearLayout){
        InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(getEditText.getWindowToken(), 0);
        getEditText.clearFocus();
        return true;
        }
    return false;
    }
}

Немного ответов на вопросы, которые я нашел на этой странице вопросов, и часть с решением "Активность", которую я нашел в этом блоге. Остальное, что я пропустил, что я должен был выяснить сам, это очистить фокус на EditText, который я добавил как внутри setOnEditorActionListener, так и onTouchLister для родительского представления.

Надеюсь, что это помогает кому-то и экономит их время.:)

Ура, Z.

В комментариях вы спросили, можно ли сфокусировать другое представление вместо EditText. Да, оно может. использование .requestFocus() метод для вида, который вы хотите сфокусировать в начале (в методе onCreate())

Также фокусировка на другом представлении вырежет некоторое количество кода. (код для сокрытия клавиатуры, например)

У меня такая же проблема. Это сделало меня более чем сумасшедшим.

У меня был расширенный диалог с ScrollView, который имел TableLayout с расширенным LinearLayout, который содержал SeekBar и EditText.

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

Я перепробовал почти все решения этой темы, и ни одно из них не помогло мне.

Итак, вот мое простое решение: (text = EditText)

text.setOnEditorActionListener( new OnEditorActionListener( ){
    public boolean onEditorAction( TextView v, int actionId, KeyEvent event ){
        if( (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) ||
            (actionId == EditorInfo.IME_ACTION_DONE) ){
            text.clearFocus( );
            InputMethodManager iMgr = null;
            iMgr = (InputMethodManager)mContext.getSystemService( Context.INPUT_METHOD_SERVICE );
            iMgr.hideSoftInputFromWindow( text.getWindowToken(), 0 );
        }
        return true;
    }
});

Кстати, я не использовал ни один из следующих фрагментов, чтобы решить это:

//setFocusableInTouchMode( true )
//setFocusable( true )
//setDescendantFocusability( ViewGroup.FOCUS_BEFORE_DESCENDANTS )

И я не использовал элемент распорки, такой как View с шириной и высотой 1dp.

Надеюсь, это кому-нибудь поможет:D

editText.setFocusableInTouchMode(true)

EditText сможет получить фокус, когда пользователь коснется его. Когда основной макет (действие, диалог и т. Д.) Становится видимым, EditText не получает фокус автоматически, хотя это первый вид в макете.

Вы также можете включить android:windowSoftInputMode="stateAlwaysHidden" в разделе манифест действий.

Это эквивалентно:

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
EditText.setOnKeyListener(new OnKeyListener() {
            public boolean onKey(View view, int keyCode, KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_ENTER) {
                    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(URLText.getWindowToken(), 0); 
                    EditText.setFocusable(false);
                    EditText.setFocusableInTouchMode(true);
                    return true;
                } else {
                    return false;
                }
            }
        });

Вы можете избежать любого фокуса на ваших элементах, установив атрибут android:downndantFocusability родительского элемента.

Вот пример:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/search__scroller"
android:descendantFocusability="blocksDescendants"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true" >
</ScrollView>

Здесь атрибут android:downndantFocusability, установленный в "blocksDescendants", блокирует фокус на дочерних элементах.

Вы можете найти больше информации здесь.

check your xml file
 <EditText
            android:id="@+id/editText1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="14sp" >

            **<requestFocus />**
 </EditText>


//Remove  **<requestFocus />** from xml
Другие вопросы по тегам