有没有办法避免在横向上全屏 SearchView/Keyboard?
Is there a way to avoid having fullscreen SearchView/Keyboard on landscape?
我试图避免在横向模式下进行全屏键盘编辑以访问建议。
我已经阅读了很多线程解释我必须添加 EditorInfo 标志,如 flagNoFullscreen and/or flagNoExtractUi。
我以编程方式添加了它们,但没有多大帮助。
有办法解决这个问题吗?
我花了一段时间才弄明白这个,但实际上很简单。
最初我创建了一个扩展 SearchView class 的自定义 class,并使用了 onCreateInputConnection()
覆盖,但是我无法以这种方式工作。
我最终以一种更简单的方式让它工作,只添加了两行代码。
您只需调用 search.getImeOptions()
获取当前配置,然后调用 setImeOptions()
:
与 EditorInfo.IME_FLAG_NO_EXTRACT_UI
进行“或”运算结果
Java:
search.setImeOptions(options|EditorInfo.IME_FLAG_NO_EXTRACT_UI);
科特林:
search.setImeOptions(search.imeOptions or EditorInfo.IME_FLAG_NO_EXTRACT_UI)
如果您不对现有选项进行“或”操作,则不会在右下角看到“搜索”完成按钮,而只会看到“完成”按钮。
这是我用来测试的完整 onCreateOptionsMenu()
覆盖(我在 xml 中使用了 SearchView,但即使您没有从 xml):
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
SearchManager manager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView search = (SearchView) menu.findItem(R.id.action_search).getActionView();
SearchableInfo si = manager.getSearchableInfo(getComponentName());
//Here is where the magic happens:
int options = search.getImeOptions();
search.setImeOptions(options|EditorInfo.IME_FLAG_NO_EXTRACT_UI);
//!!!!!!!!!!!
search.setSearchableInfo(si);
search.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String query) {
return true;
}
});
return true;
}
这是我在 menu_main.xml 中用于 SearchView 的 xml:
<item android:id="@+id/action_search"
android:title="Search"
android:icon="@android:drawable/ic_menu_search"
app:showAsAction="always"
app:actionViewClass="android.support.v7.widget.SearchView"
/>
没有调用 setImeOptions()
的结果:
调用 setImeOptions()
的结果:
代码的另一种替代方法是在 searchView xml 中添加 属性,这对小于 16 的 API 很有用:
<SearchView
android:imeOptions="flagNoExtractUi" />
与上面的想法相同,但没有 SearchView,仅使用可搜索 XML
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
...
android:imeOptions="actionSearch|flagNoExtractUi"
...
</searchable>
我试图避免在横向模式下进行全屏键盘编辑以访问建议。
我已经阅读了很多线程解释我必须添加 EditorInfo 标志,如 flagNoFullscreen and/or flagNoExtractUi。
我以编程方式添加了它们,但没有多大帮助。
有办法解决这个问题吗?
我花了一段时间才弄明白这个,但实际上很简单。
最初我创建了一个扩展 SearchView class 的自定义 class,并使用了 onCreateInputConnection()
覆盖,但是我无法以这种方式工作。
我最终以一种更简单的方式让它工作,只添加了两行代码。
您只需调用 search.getImeOptions()
获取当前配置,然后调用 setImeOptions()
:
EditorInfo.IME_FLAG_NO_EXTRACT_UI
进行“或”运算结果
Java:
search.setImeOptions(options|EditorInfo.IME_FLAG_NO_EXTRACT_UI);
科特林:
search.setImeOptions(search.imeOptions or EditorInfo.IME_FLAG_NO_EXTRACT_UI)
如果您不对现有选项进行“或”操作,则不会在右下角看到“搜索”完成按钮,而只会看到“完成”按钮。
这是我用来测试的完整 onCreateOptionsMenu()
覆盖(我在 xml 中使用了 SearchView,但即使您没有从 xml):
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
SearchManager manager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView search = (SearchView) menu.findItem(R.id.action_search).getActionView();
SearchableInfo si = manager.getSearchableInfo(getComponentName());
//Here is where the magic happens:
int options = search.getImeOptions();
search.setImeOptions(options|EditorInfo.IME_FLAG_NO_EXTRACT_UI);
//!!!!!!!!!!!
search.setSearchableInfo(si);
search.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String query) {
return true;
}
});
return true;
}
这是我在 menu_main.xml 中用于 SearchView 的 xml:
<item android:id="@+id/action_search"
android:title="Search"
android:icon="@android:drawable/ic_menu_search"
app:showAsAction="always"
app:actionViewClass="android.support.v7.widget.SearchView"
/>
没有调用 setImeOptions()
的结果:
调用 setImeOptions()
的结果:
代码的另一种替代方法是在 searchView xml 中添加 属性,这对小于 16 的 API 很有用:
<SearchView
android:imeOptions="flagNoExtractUi" />
与上面的想法相同,但没有 SearchView,仅使用可搜索 XML
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
...
android:imeOptions="actionSearch|flagNoExtractUi"
...
</searchable>