Я хотел бы удалить фокус из EditText. Например, если появляется Клавиатура, и пользователь скрывает ее с помощью кнопки "Назад", мне бы хотелось, чтобы фокус и курсор исчезли. Как это можно сделать?
Android: принудительно EditText удалить фокус?
Ответ 1
Вы можете добавить это в onCreate
, и он будет скрывать клавиатуру каждый раз, когда запускается активность.
Вы также можете программно изменить фокус на другой элемент.
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Ответ 2
Вы можете сделать курсор и фокус исчезнуть на
edittext.clearFocus();
Но обнаруживайте, когда скрыть клавиатуру - это тяжелая работа.
Ответ 3
Добавьте LinearLayout
до EditText
в свой XML.
<LinearLayout
android:focusable="true"
android:focusableInTouchMode="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" />
Ответ 4
Удалите фокус, но оставайтесь в фокусе:
editText.setFocusableInTouchMode(false);
editText.setFocusable(false);
editText.setFocusableInTouchMode(true);
editText.setFocusable(true);
EditText потеряет фокус, но может снова получить его при новом событии касания.
Ответ 5
удалить автофокус edittext android
Он работает для меня
Изменить. В ссылке они предлагают использовать LinearLayout, но простой просмотр будет работать
<View
android:id="@+id/focus_thief"
android:layout_width="1dp"
android:layout_height="1dp"
android:focusable="true"
android:focusableInTouchMode="true" />
Затем, если этот "вор" помещен в верхнюю часть макета (чтобы быть первым настраиваемым элементом), вызовы clearFocus()
будут работать.
Ответ 6
Добавьте эти два свойства в родительский макет (например: Linear Layout, Relative Layout)
android:focusable="true"
android:focusableInTouchMode="true"
Он выполнит трюк:)
Ответ 7
Вы также можете включить 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);
Ответ 8
вам нужно удалить <requestFocus/>
если вы не используете его и все еще ту же проблему
user LinearLayout
в качестве родителя и установите
android:focusable="true"
android:focusableInTouchMode="true"
Надеюсь, он вам поможет.
Ответ 9
попробуйте использовать это в своем представлении это сработало для меня:
<View
android:id="@+id/fucused"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="true"
android:focusableInTouchMode="true"/>
Ответ 10
Чтобы скрыть клавиатуру при запуске активности, напишите следующий код в onCreate()..
InputMethodManager imm = (InputMethodManager)
getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);
Чтобы очистить фокус и удалить курсор из edittext.....
editText.clearFocus();
editText.setCursorVisible(false);
Ответ 11
Это мой самый первый ответ на 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>
Итак, мне нужно было кое-что здесь. Мне нужно было иметь Placeholder для моего 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;
}
}
Несколько ответов на бит, которые я нашел на этой странице вопросов, и часть с решением Activity, которое я нашел на этом blog. Остальное, что я пропустил, которое я должен был выяснить, это очистить внимание на EditText, который я добавил как внутри setOnEditorActionListener, так и onTouchLister для родительского представления.
Надеюсь, это помогает кому-то и экономит свое время.:)
Cheers, Z.
Ответ 12
В комментариях вы спросили, можно ли сфокусировать другое представление вместо EditText. Да, оно может. Используйте метод .requestFocus()
для представления, которое вы хотите сфокусировать в начале (в методе onCreate())
Кроме того, фокусировка другого вида вырезает некоторый код. (например, код для скрытия клавиатуры)
Ответ 13
Добавьте в родительский макет, где вы положили EditText
этот android:focusableInTouchMode="true"
Ответ 14
Вы также можете включить android:windowSoftInputMode="stateAlwaysHidden"
в свой раздел действий манифеста.
Это эквивалентно:
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Ответ 15
У меня была та же проблема. Это сделало меня более сумасшедшим.
У меня был расширенный диалог с 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 )
И я не использовал элемент spacer, например View с шириной и высотой 1dp.
Надеюсь, это поможет кому-то: D
Ответ 16
editText.setFocusableInTouchMode(true)
EditText
сможет получить фокус, когда пользователь коснется его.
Когда основной макет (активность, диалог и т.д.) Становится видимым, EditText
автоматически не получает фокус, даже если это первый вид в макете.
Ответ 17
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;
}
}
});
Ответ 18
Вы можете избежать фокусировки на своих элементах, установив атрибут 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", блокирует фокус на дочерних элементах.
Вы можете найти более подробную информацию здесь.
Ответ 19
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