【问题标题】:Android Searchview gets refocused when returning from another fragment从另一个片段返回时,Android Searchview 会重新聚焦
【发布时间】:2021-12-31 03:25:26
【问题描述】:

目前正在使用喷气背包导航并希望使用单个活动。但是,每当我从卡片详细信息返回搜索时,searchview 都会重新获得焦点,即使我在单击搜索后已移除焦点。见here

我目前正在做的移除焦点是我的工具栏上方有一个虚拟视图

<com.google.android.material.appbar.MaterialToolbar
    android:id="@+id/database_toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:layout_constraintTop_toTopOf="parent"
    style="@style/Widget.MaterialComponents.Toolbar.Primary" />

    <!-- Dummy view for receiving focus after SearchView clears focus -->
    <View
        android:id="@+id/focus_dummy_view"
        android:focusableInTouchMode="true"
        android:focusable="true"
        android:background="@android:color/transparent"
        android:layout_width="match_parent"
        android:layout_height="1dp"
        app:layout_constraintBottom_toTopOf="@id/database_toolbar" />

</com.google.android.material.appbar.MaterialToolbar>

在我执行搜索后,我会这样做

searchView.clearFocus()
binding.focusDummyView.requestFocus()

我目前的解决方法是在活动中托管详细信息,但我宁愿不这样做。我创建了一个新的project,但仍然看到此问题发生。

一些额外的上下文是,这仅在从 1.2.5 更新到 "androidx.fragment:fragment-ktx:1.4.0" 后发生。我在错误跟踪器中提出了这个问题,但他们还没有回复我。想知道是否有人知道解决方法?

【问题讨论】:

    标签: android searchview android-jetpack-navigation


    【解决方案1】:

    你为什么不试试

    在科特林中

         override fun onResume(){
            super.onResume()
            // Only runs if there is a view that is currently focused
            searchView.currentFocus?.let { view ->
            val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager
            imm?.hideSoftInputFromWindow(view.windowToken, 0)
            searchView.clearFocus()
    
    }
       
            }
    

    【讨论】:

    • 感谢您的回答!这仍然会导致键盘闪烁,如图所示
    • 我已经编辑了答案,请尝试一下!
    【解决方案2】:

    您必须在根布局 xml 中添加这两行代码。 要从视图中清除焦点,您可以调用 getCurrentFocus().clearFocus() 但请记住,这只会将焦点从当前视图移动到视图中的第一个元素,而不是完全从视图中移除焦点;因此,如果布局中的第一个元素是 EditText,它将再次获得焦点。

    确保视图不再获得焦点的一种方法是将此属性添加到 xml 中的根视图中,从而使根视图能够捕获焦点。 要从视图中清除焦点,您可以调用 getCurrentFocus().clearFocus() 但请记住,这只会将焦点从当前视图移动到视图中的第一个元素,而不是完全从视图中移除焦点;因此,如果布局中的第一个元素是 EditText,它将再次获得焦点。

    确保视图不再获得焦点的一种方法是将此属性添加到 xml 中的根视图中,使根视图能够捕获焦点

    android:focusableInTouchMode="true"
    android:descendantFocusability="beforeDescendants"
    

    之后你需要从onResume()清除焦点 我认为这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-12
      • 1970-01-01
      • 2012-04-22
      • 1970-01-01
      • 1970-01-01
      • 2015-08-26
      • 1970-01-01
      相关资源
      最近更新 更多