Android: заставить EditText удалить фокус? [дубликат]
этот вопрос уже есть ответ здесь:
Я хотел бы иметь возможность удалить фокус из EditText. Например, если клавиатура появляется, и пользователь скрывает ее с помощью кнопки "назад", я хотел бы, чтобы фокус и курсор исчезли. Как можно ли это сделать?
19 ответов:
Вы можете добавить это
onCreateи он будет скрывать клавиатуру каждый раз, когда начинается activty.вы также можете программно изменять фокус на другой элемент.
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 потеряет фокус, но может получить его снова на новом событии касания.
удалить автофокус edittext android
это работает для меня
Edit в ссылке они предлагают использовать LinearLayout, но простой вид будет работать
<View android:id="@+id/focus_thief" android:layout_width="1dp" android:layout_height="1dp" android:focusable="true" android:focusableInTouchMode="true" />затем, если этот " вор " помещается в верхней части макета (чтобы быть первым фокусируемым элементом), вызывает
clearFocus()будет работать.
добавьте эти два свойства в родительский макет (например: линейный макет, относительный макет)
android:focusable="true" android:focusableInTouchMode="true"Это будет делать трюк :)
вы также можете включить android: windowSoftInputMode= "stateAlwaysHidden" в разделе манифеста действий.
Это эквивалентно :
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);но в XML-способе.
FYI, вы также можете скрыть клавиатуру с кодами:
// hide virtual keyboard InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(mYourEditText.getWindowToken(), 0);
вы должны удалить
<requestFocus/>Если вы не используете его и все равно та же проблема
пользователей
LinearLayoutкак родитель и установитьandroid:focusable="true" android:focusableInTouchMode="true"надеюсь, что это поможет вам.
попробуйте использовать это на ваш взгляд это сработало для меня:
<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"
чтобы скрыть клавиатуру при запуске активности.. напишите следующий код в onCreate()..
InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);чтобы очистить фокус и удалить курсор из edittext.....
editText.clearFocus(); editText.setCursorVisible(false);
Это мой самый первый ответ на SO, так что не будьте слишком суровы ко мне, если есть ошибки. : D
есть несколько ответов, плавающих вокруг так, но я чувствую желание опубликовать мое полное решение, потому что это свело меня с ума. Я схватил кусочки со всех сторон, так что простите меня, если я не даю соответствующие кредиты всем... :)
(я упрощу свой результат, потому что в моем представлении слишком много элементов, и я не хочу спама с этим и попытаюсь сделать его таким же общим, как вероятный...)
для вашего макета вам нужен родитель ваш 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: hint= "подсказка"
и
android:descendantFocusability="beforeDescendants" android:focusableInTouchMode="true"это произошло на EditText не быть сфокусированным на входе активность и активность сам при его установке этот параметр помогает, так что вы можете установить 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 для Родительский вид.
надеюсь, что это помогает кто-то и экономит их время. :)
Ура, З.
в комментариях вы спросили, Можно ли сфокусировать другое представление вместо EditText. Да, может. Используйте
.requestFocus()метод для представления, которое вы хотите сфокусировать в начале (в методе onCreate ())также фокусировка другой вид будет вырезать некоторое количество кода. (например, код для скрытия клавиатуры)
вы также можете включить
android:windowSoftInputMode="stateAlwaysHidden"в разделе манифест действий.Это эквивалентно:
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
у меня была та же проблема. Это сделало меня более чем сумасшедшим.
у меня был расширенный диалог с ScrollView, который имел TableLayout с расширенным LinearLayout, который содержал панель поиска и 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 )И не используется элемент распорки, как вид с шириной и высотой 1dp.
надеюсь, это поможет кому-то: D
editText.setFocusableInTouchMode(true)The
EditTextсможет получить фокус, когда пользователь прикоснется к нему. Когда основной макет (активность, диалог и т. д.) становится видимымEditTextне получает автоматически фокус, даже если это первый вид в макете.
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: descendantFocusability родительского элемента.
вот пример:
<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: descendantFocusability, установленный в" 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
Comments