Невозможно автоматически отобразить клавиатуру в SearchView
По умолчанию SearchView сфокусирован, но когда я пытаюсь показать программную клавиатуру, этого не происходит:
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
Но когда я нажимаю на SearchView - это делает. Зачем?
11 ответов
Исправлена!
mSearchView.setOnQueryTextFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean hasFocus) {
if (hasFocus) {
showInputMethod(view.findFocus());
}
}
});
А также
private void showInputMethod(View view) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
imm.showSoftInput(view, 0);
}
}
Я столкнулся с этой проблемой с SearchView, который все еще не открывал клавиатуру, и смог сделать это, добавив задержку в 200 мс:
mSearchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(final View view, boolean hasFocus) {
if (hasFocus) {
view.postDelayed(new Runnable() {
@Override
public void run() {
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(view.findFocus(), 0);
}
}, 200);
}
}
});
Если вы используете SearchView:
<android.support.v7.widget.SearchView
android:id="@+id/searchView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusableInTouchMode="true"
android:iconifiedByDefault="true"
app:showAsAction="always"
app:iconifiedByDefault="true"/>
Затем просто добавьте его в ваш метод onCreate:
final SearchManager searchManager = (SearchManager) getSystemService(SEARCH_SERVICE);
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
searchView.setIconifiedByDefault(false);
searchView.setFocusable(true);
searchView.setIconified(false);
searchView.requestFocusFromTouch();
Меня устраивает.
Как насчет использования setOnFocusChangeListener
?
searchview.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus){
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
}
}
});
Лучший и самый простой способ сделать это:
android:focusable="true"
app:iconifiedByDefault="false"
android:focusableInTouchMode="true"
Добавьте три вышеупомянутые строки в ваш XML под SearchView и увидите магию....!!
Пытаться:
void focusSearchViewAndOpenOrCloseKeyboard(boolean focus) {
searchView.setIconified(focus);
}
Источник показывает нам, что SearchView
обрабатывает собственное закрытие и открытие программной клавиатуры.
<EditText
android:id="@+id/edt_search"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerVertical="true"
android:background="@null"
android:ellipsize="end"
android:hint="@string/SERACH"
android:imeOptions="actionSearch"
android:inputType="textVisiblePassword"
android:singleLine="true"
android:textAlignment="viewStart" />
Добавить
<requestFocus />
в вашем поисковом представлении вот так
<EditText
android:id="@+id/et_search"
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="@android:color/transparent"
android:imeOptions="actionSearch"
android:maxLines="1"
android:padding="8dp"
android:singleLine="true"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
android:textColor="@android:color/white"
android:textColorHint="#e6e6e6">
<requestFocus />
</EditText>
Мне нужно, чтобы клавиатура появлялась автоматически и была готова к вводу текста с мигающим курсором.
Это то , что сработало для меня. ВonViewCreated
, я добавил эти две конкретные строки:
binding.searchView.isIconified = false
binding.searchView.requestFocus()
Код:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.searchView.isIconified = false
binding.searchView.requestFocus()
// ...
}
Я пробовал все решения, но, наконец, единственное, что сработало для меня, это следующее:
котлин версия:
mSearchView.viewTreeObserver.addOnGlobalLayoutListener(object: OnGlobalLayoutListener {
override fun onGlobalLayout() {
mSearchView.requestFocus()
val imm = getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
imm.showSoftInput(mSearchView, 0)
mSearchView.viewTreeObserver.removeOnGlobalLayoutListener(this)
}
})
Java-версия:
mSearchView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
mSearchView.requestFocus();
InputMethodManager imm = (InputMethodManager)
getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.showSoftInput(mSearchView, 0);
mSearchView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
});
Я решил эту проблему следующим простым способом.
Пункт меню SearchView:
<item
android:id="@+id/menu_item_search"
android:icon="@drawable/ic_search"
android:title="@android:string/search_go"
app:actionViewClass="android.support.v7.widget.SearchView"
app:showAsAction="always|collapseActionView" />
Чтобы развернуть SearchView и показать клавиатуру программно, вызовите:
mMenuItemSearch.expandActionView();
mSearchView.setQuery("your default query test or null", true);
Протестировано с разными флагами showAsAction. В результате клавиатура не отображается, когда флаг: "всегда". Однако все работает с флагом: "всегда | collapseActionView"
expandActionView () + setQuery ("нулевой или восстановленный текст", true); может вызываться при создании (или восстановлении) представления, чтобы показать клавиатуру и сосредоточиться на поиске. PS: вызовите mSearchView.clearFocus(); после этого два метода, чтобы очистить фокус.