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