【问题标题】:Is there a way to avoid having fullscreen SearchView/Keyboard on landscape?有没有办法避免在横向上使用全屏 SearchView/Keyboard?
【发布时间】:2015-10-06 00:09:16
【问题描述】:

我试图避免在横向上进行全屏键盘编辑,以便访问建议。

我已经阅读了很多帖子,说明我必须添加 EditorInfo 标志,例如 flagNoFullscreen 和/或 flagNoExtractUi

我以编程方式添加了它们,但并没有真正的帮助。

有没有办法解决这个问题?

【问题讨论】:

标签: java android user-interface landscape searchview


【解决方案1】:

我花了一些时间才弄明白这个,但实际上很简单。

最初我创建了一个扩展 SearchView 类的自定义类,并使用了 onCreateInputConnection() 覆盖,但是我无法让它以这种方式工作。

我最终让它以一种更简单的方式工作,只添加了两行代码。

您只需要调用search.getImeOptions() 来获取当前配置,然后使用EditorInfo.IME_FLAG_NO_EXTRACT_UI 调用setImeOptions() 来“或”结果:

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 膨胀 SearchView,此解决方案也应该适用于您):

@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()的结果:

【讨论】:

  • 这个解决方案对我有用。非常感谢@Daniel。
  • 在 xml 中设置它(如其他答案中所写)“可能”无法正常工作,因为您设置的方式。因此,如果 xml 版本在所有情况下都不适用于您,请在此答案中的代码中设置它。
  • 这实际上仍然有效,如果您正在寻找 Kotlin 方式:search.setImeOptions(search.imeOptions or EditorInfo.IME_FLAG_NO_EXTRACT_UI)
  • @RominaLiuzzi 我更新了答案,谢谢!
【解决方案2】:

代码的另一种替代方法是在searchView xml中添加属性,这对于小于16的API很有用:

<SearchView
    android:imeOptions="flagNoExtractUi" />

【讨论】:

    【解决方案3】:

    与上面写的想法相同,但没有 SearchView,只使用可搜索的 XML

    <searchable xmlns:android="http://schemas.android.com/apk/res/android"
     ...
     android:imeOptions="actionSearch|flagNoExtractUi"
     ...
    </searchable>
    

    【讨论】:

    • 我可以确认这对我有用。非常感谢。
    猜你喜欢
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 2016-09-10
    • 2019-05-29
    • 2014-11-17
    • 2011-09-13
    • 1970-01-01
    相关资源
    最近更新 更多