В своем фрагменте я сохраняю два простых вида поиска. Если я заполню второе представление поиска, если я оставлю активность (отмеченную как убитую из параметров разработчика) и вернусь снова, 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, вы помещаете на свой экран в основном два текста редактирования с одинаковым идентификатором.
Поскольку эти редактируемые тексты имеют одинаковые идентификаторы, когда Android восстанавливает свое состояние, он использует второй запрос (потому что Android использует пары идентификаторов и значений для восстановления состояния с помощью SparseArray).
Чтобы исправить это, вы можете в основном использовать onSaveInstanceState для сохранения ваших запросов и onRestoreInstanceState для восстановления после kill kill.