Android searchview 保存了错误的状态
Android searchview saves wrong state
在我的片段中,我保存了两个简单的搜索视图。如果我将填充第二个搜索视图,如果我将离开 activity(标记为从开发选项中被杀死)并再次返回,android 会自动恢复搜索视图查询,但它们有错误的文本(第二个查询也将设置为第一个)。我如何强制 android 不为我的搜索视图自动保存状态?
configureSearchViews 是从 onViewCreated 调用的
private fun configureSearchViews() {
ibFirstView.show()
svFirstField.queryHint = getString(R.string.enter_stop)
svFirstField.inputType = InputType.TYPE_CLASS_TEXT
setFirstFieldQueryTextListener()
svFirstField.setOnQueryTextFocusChangeListener(this)
svSecondField.queryHint = getString(R.string.enter_number)
svSecondField.inputType = InputType.TYPE_CLASS_NUMBER
setSecondFieldQueryTextListener()
svSecondField.setOnQueryTextFocusChangeListener(this)
}
这是我的 xml 文件:
<LinearLayout
android:id="@+id/llFirsField"
android:layout_width="match_parent"
android:layout_height="@dimen/view_loc_selector_height"
android:background="@drawable/view_rounded_white_bg"
android:layoutAnimation="@null"
android:padding="0dp"
android:stateListAnimator="@null">
<SearchView
android:id="@+id/svFirstField"
android:layout_width="0dp"
android:layout_height="@dimen/view_loc_selector_height"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:backgroundTint="@android:color/white"
android:clickable="true"
android:fontFamily="@font/montserrat_medium"
android:iconifiedByDefault="false"
android:queryBackground="@android:color/transparent"
android:queryHint="@string/enter_bus_stop"
android:textColor="@color/colorTextDarkGray"
android:textSize="@dimen/text_size_search" />
<ImageButton
android:id="@+id/ibFirstView"
android:layout_width="40dp"
android:layout_height="@dimen/view_loc_selector_height"
android:layout_gravity="center_vertical"
android:background="@null"
android:src="@drawable/ic_pin" />
</LinearLayout>
<View
android:id="@+id/vDividerSelector"
android:layout_width="match_parent"
android:layout_height="4dp"
android:layout_below="@+id/llFirsField" />
<LinearLayout
android:id="@+id/llSecondField"
android:layout_width="match_parent"
android:layout_height="@dimen/view_loc_selector_height"
android:layout_below="@+id/vDividerSelector"
android:background="@drawable/view_rounded_white_bg"
android:layoutAnimation="@null"
android:padding="0dp"
android:stateListAnimator="@null">
<SearchView
android:id="@+id/svSecondField"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:backgroundTint="@android:color/white"
android:clickable="true"
android:fontFamily="@font/montserrat_medium"
android:iconifiedByDefault="false"
android:inputType="number"
android:queryBackground="@android:color/transparent"
android:queryHint="@string/enter_buss_number"
android:textColor="@color/colorTextDarkGray"
android:textSize="@dimen/text_size_search"
/>
</LinearLayout>
我在 SearchView
的源代码中看到它正在膨胀内部的编辑文本。当你放置两个 SearchView 时,你基本上将两个具有相同 id 的编辑文本放置到你的屏幕上。
由于这些编辑文本具有相同的 id,当 android 恢复它们的状态时,它使用第二个查询(因为 android 使用 id-value 对来使用 SparseArray 恢复状态)。
要解决此问题,您基本上可以使用 onSaveInstanceState
保存您的查询,并使用 onRestoreInstanceState
从 activity kill.
恢复
在我的片段中,我保存了两个简单的搜索视图。如果我将填充第二个搜索视图,如果我将离开 activity(标记为从开发选项中被杀死)并再次返回,android 会自动恢复搜索视图查询,但它们有错误的文本(第二个查询也将设置为第一个)。我如何强制 android 不为我的搜索视图自动保存状态?
configureSearchViews 是从 onViewCreated 调用的
private fun configureSearchViews() {
ibFirstView.show()
svFirstField.queryHint = getString(R.string.enter_stop)
svFirstField.inputType = InputType.TYPE_CLASS_TEXT
setFirstFieldQueryTextListener()
svFirstField.setOnQueryTextFocusChangeListener(this)
svSecondField.queryHint = getString(R.string.enter_number)
svSecondField.inputType = InputType.TYPE_CLASS_NUMBER
setSecondFieldQueryTextListener()
svSecondField.setOnQueryTextFocusChangeListener(this)
}
这是我的 xml 文件:
<LinearLayout
android:id="@+id/llFirsField"
android:layout_width="match_parent"
android:layout_height="@dimen/view_loc_selector_height"
android:background="@drawable/view_rounded_white_bg"
android:layoutAnimation="@null"
android:padding="0dp"
android:stateListAnimator="@null">
<SearchView
android:id="@+id/svFirstField"
android:layout_width="0dp"
android:layout_height="@dimen/view_loc_selector_height"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:backgroundTint="@android:color/white"
android:clickable="true"
android:fontFamily="@font/montserrat_medium"
android:iconifiedByDefault="false"
android:queryBackground="@android:color/transparent"
android:queryHint="@string/enter_bus_stop"
android:textColor="@color/colorTextDarkGray"
android:textSize="@dimen/text_size_search" />
<ImageButton
android:id="@+id/ibFirstView"
android:layout_width="40dp"
android:layout_height="@dimen/view_loc_selector_height"
android:layout_gravity="center_vertical"
android:background="@null"
android:src="@drawable/ic_pin" />
</LinearLayout>
<View
android:id="@+id/vDividerSelector"
android:layout_width="match_parent"
android:layout_height="4dp"
android:layout_below="@+id/llFirsField" />
<LinearLayout
android:id="@+id/llSecondField"
android:layout_width="match_parent"
android:layout_height="@dimen/view_loc_selector_height"
android:layout_below="@+id/vDividerSelector"
android:background="@drawable/view_rounded_white_bg"
android:layoutAnimation="@null"
android:padding="0dp"
android:stateListAnimator="@null">
<SearchView
android:id="@+id/svSecondField"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:backgroundTint="@android:color/white"
android:clickable="true"
android:fontFamily="@font/montserrat_medium"
android:iconifiedByDefault="false"
android:inputType="number"
android:queryBackground="@android:color/transparent"
android:queryHint="@string/enter_buss_number"
android:textColor="@color/colorTextDarkGray"
android:textSize="@dimen/text_size_search"
/>
</LinearLayout>
我在 SearchView
的源代码中看到它正在膨胀内部的编辑文本。当你放置两个 SearchView 时,你基本上将两个具有相同 id 的编辑文本放置到你的屏幕上。
由于这些编辑文本具有相同的 id,当 android 恢复它们的状态时,它使用第二个查询(因为 android 使用 id-value 对来使用 SparseArray 恢复状态)。
要解决此问题,您基本上可以使用 onSaveInstanceState
保存您的查询,并使用 onRestoreInstanceState
从 activity kill.