我们在 ActionBar 上有一个 SearchView,它被设置为非图标化。由于在用户输入要搜索的内容之前视图中没有任何内容,因此为 SearchView 提供初始焦点是有意义的,并确保软键盘已准备好供用户输入文本 - 否则他们'总是必须先点击 SearchView。
我只需调用即可赋予 SearchView 焦点
searchView.requestFocus();
但我无法显示软键盘。在我们的另一个片段中,我有一个 EditText,我们想要聚焦它,我可以通过调用
让软键盘出现在那里InputMethodManager mgr = (InputMethodManager)getActivity().getSystemService(
Context.INPUT_METHOD_SERVICE);
mgr.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
但这在 SearchView 上不起作用。肯定有可能让它发挥作用。
进一步翻查 StackOverflow,我发现了这个问题:
其中包含对我有用的解决方案:
((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)).
toggleSoftInput(InputMethodManager.SHOW_FORCED,
InputMethodManager.HIDE_IMPLICIT_ONLY);
我有一个类似的问题,这里提出的解决方案都不起作用。有些根本没有让键盘出现,有些显示键盘,但按那里的键不起作用。
唯一有效的是:
// hack for making the keyboard appear
searchView.setIconified(true);
searchView.setIconified(false);
我正在使用带有 setIconifiedByDefault(false) 的 SearchView。使用 Android 4.4.2 进行测试,让键盘实际显示的唯一方法是查看 SearchView 的源代码并模仿它请求键盘显示的方式。我已经尝试了几乎所有我能找到/想到的其他方法,这是我能让键盘可靠显示的唯一方法。不幸的是,我的方法需要一些反思。
在onCreateOptionsMenu(菜单)中:
searchView.requestFocus();
searchView.post(new Runnable() {
@Override
public void run() {
showSoftInputUnchecked();
}
});
然后创建一个方法来调用InputMethodManager中的隐藏方法“showSoftInputUnchecked”:
private void showSoftInputUnchecked() {
InputMethodManager imm = (InputMethodManager)
getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
Method showSoftInputUnchecked = null;
try {
showSoftInputUnchecked = imm.getClass()
.getMethod("showSoftInputUnchecked", int.class, ResultReceiver.class);
} catch (NoSuchMethodException e) {
// Log something
}
if (showSoftInputUnchecked != null) {
try {
showSoftInputUnchecked.invoke(imm, 0, null);
} catch (IllegalAccessException e) {
// Log something
} catch (InvocationTargetException e) {
// Log something
}
}
}
}
与所有访问公共 API 之外的方法的解决方案一样,我不能保证这不会在新版本的 Android 中出现问题。
它对我有用。
private SearchView mSearchView;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
SearchManager searchManager =
(SearchManager) getSystemService(Context.SEARCH_SERVICE);
MenuItem searchItem = menu.findItem(R.id.action_search);
mSearchView =
(SearchView) searchItem.getActionView();
mSearchView.setSearchableInfo(
searchManager.getSearchableInfo(getComponentName()));
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_search) {
mSearchView.setIconifiedByDefault(true);
mSearchView.setFocusable(true);
mSearchView.setIconified(false);
mSearchView.requestFocusFromTouch();
}
return super.onOptionsItemSelected(item);
}
如果你想显示软键盘并聚焦于输入框,可以尝试
final MenuItem menuItem = menu.findItem(R.id.action_search);
menuItem.expandActionView();//expand show soft keyboard
<item
android:id="@+id/action_search"
android:icon="@drawable/ic_actionbar_search"
liven:showAsAction="collapseActionView|always" //always
liven:actionViewClass="android.support.v7.widget.SearchView" />enter code here
每次您参加活动时,这不会显示键盘
searchview.clearFocus();
对我有用
fun View.showKeyboard() {
val viewWithFocus = findFocus()
if (viewWithFocus != null) {
val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.showSoftInput(viewWithFocus, 0)
}
}
使用expandView方法: 你的 onCreateOptionsMenu 可能是这样的:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//Used to put dark icons on light action bar
final SearchView searchView = new SearchView(getSupportActionBar().getThemedContext());
MenuItem mitem = menu.add("Search");
mitem.setIcon(ic_search_inverse)
.setActionView(searchView)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
mitem.expandActionView();
listsearch.setOnItemClickListener(this);
return true;
}
你可以试试我做的。这对我来说效果很好。
//set query change listener
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener(){
@Override
public boolean onQueryTextChange(String newText) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean onQueryTextSubmit(String query) {
/**
* hides and then unhides search tab to make sure keyboard disappears when query is submitted
* 4 = INVISIBLE
* 0 = VISIBLE
*/
searchView.setVisibility(4);
searchView.setVisibility(0);
return false;
}
});