【问题标题】:Expanding searchView Automatically in Kotlin在 Kotlin 中自动扩展 searchView
【发布时间】:2020-05-27 13:09:46
【问题描述】:

我的 IndexActivity 中有一个 searchView。单击 searchView 后,将启动一个名为 SearchActivity 的新活动。 再次在搜索活动中,我有在点击时展开的 searchView。它有一个执行外部 API 调用的查询侦听器。

但是,在我通过单击 searchView 图标打开 SearchActivity 后,我必须再次单击 searchView 才能输入它。我想要的是 searchView 应该在活动开始后立即关注。 这是我的搜索活动代码:

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        menuInflater.inflate(R.menu.toolbar_search, menu)
        val searchView: SearchView =
            menu?.findItem(R.id.menu_search)?.actionView as SearchView
        // searchView.setIconifiedByDefault(false)
        // searchView.focusable = View.FOCUSABLE
        // searchView.isIconified = false
        // searchView.requestFocusFromTouch()
        // searchView.onActionViewExpanded()

注释的行是我通过在网络上搜索尝试的行,但它似乎不起作用。

这是我在toolbar_searchbar.xml中的代码,它包含在SearchActivity设置的activity_search中:

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.google.android.material.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <androidx.appcompat.widget.Toolbar
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:titleTextColor="@color/cardview_light_background"
            app:subtitleTextAppearance="@font/alegreya_sans_medium"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            android:background="@android:color/transparent"
            android:id="@+id/toolbar_searchbar"
            app:popupTheme="@style/AppTheme.PopupOverlay">
        </androidx.appcompat.widget.Toolbar>
    </com.google.android.material.appbar.AppBarLayout>


</androidx.coordinatorlayout.widget.CoordinatorLayout>

这是toolbar_search.xml的代码,如上面提供的代码所示:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:title="Search"
        android:id="@+id/menu_search"
        android:icon="@drawable/quantum_ic_search_grey600_24"
        app:showAsAction="always|collapseActionView"
        app:actionViewClass="androidx.appcompat.widget.SearchView"
        />

</menu>

这是我一开始得到的。

这是我一开始就想要的。

【问题讨论】:

  • 这是我尝试但没有成功的第一条注释行。我也不能在 xml 文件中设置它,因为 indexactivity 中也使用了相同的 xml 文件,我不想展开视图。
  • 你试过 searchView.requestFocus() 吗?此外,如果即使使用requestFocus() 后键盘仍无法自行打开,您可以显式地open the keyboard。我相信这肯定会奏效。

标签: android kotlin


【解决方案1】:

确保导入:androidx.appcompat.widget.SearchView

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/search_contacts"
        android:title="search"
        android:icon="@android:drawable/ic_menu_search"
        app:showAsAction="always"
        app:actionViewClass="androidx.appcompat.widget.SearchView" >
    </item>
</menu>
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater.inflate(R.menu.search_view, menu)
    val searchView: SearchView =
        menu?.findItem(R.id.search_contacts)?.actionView as SearchView

    searchView.isIconified = false
    return true
}

【讨论】:

  • 这使它工作,但我不能再返回箭头,如图所示。如果我更改我的 showAsAction 属性,就会发生这种情况。
  • @AniketBote 你需要在你的工具栏上设置一个后退箭头图标并为其设置一个监听器,它与 SearchView 无关。
【解决方案2】:

对您来说,将所有内容都放在一个活动上并且只有一个工具栏会更容易。您不需要创建另一个活动来启动另一个逻辑,它不应该与 UI 绑定。

所以您的解决方案是创建一个容器片段(如果您需要几个屏幕),在其顶部添加一个工具栏,仅此而已。将逻辑移动到 ViewModel 并在那里执行所有逻辑。

通过这种方法,您将解决一些问题:

  • 换屏时不会眨眼
  • 键盘处理(打开/关闭)
  • 您可以更轻松、更正确地控制 SearchView 的工具栏和焦点
  • 您并没有解决方法不正确的问题,而是以更好的方式实现一切

【讨论】:

    猜你喜欢
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    • 1970-01-01
    相关资源
    最近更新 更多