Расширения Kotlin Android и сохраненный фрагмент

Я использую расширения Kotlin для Android в своем проекте, и я столкнулся с каким-то поведением, которое я не могу понять. Я использую этот код для сохранения моего фрагмента в активности:

val fragment = fragmentManager.findFragmentByTag("hello") ?: HelloFragment() fragmentManager.beginTransaction() .replace(R.id.fragment_container, fragment, "hello") .commit() 

Это сохранившийся Fragment :

 import kotlinx.android.synthetic.hello.* public class HelloFragment : Fragment() { val text = "Hello world!" override fun onCreate(savedInstanceState: Bundle?) { super<Fragment>.onCreate(savedInstanceState) setRetainInstance(true) } override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater?.inflate(R.layout.hello, container, false) } override fun onViewCreated(view: View?, savedInstanceState: Bundle?) { super<Fragment>.onViewCreated(view, savedInstanceState) text_view.setText(text) // <- does not work when retained } } 

И его XML-макет hello.xml :

 <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/text_view" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" /> 

Все работает так, как ожидалось – text_view.setText() отображает Hello world! На экране при первом запуске. Но когда вы поворачиваете экран, text_view.setText() не работает. Это странно, потому что text_view не имеет значения NULL и должен ссылаться на некоторое представление. Если вы удалите setRetainInstance(true) и оставьте воссоздание фрагмента каждый раз, когда эта проблема исчезнет. Любые мысли, что может вызвать эту проблему?

Solutions Collecting From Web of "Расширения Kotlin Android и сохраненный фрагмент"

View кеша не очищается после вызова onDestroyView() . Существует открытый вопрос .

На данный момент вы можете явно вызвать clearFindViewByIdCache() в onDestroyView() чтобы очистить кеш. Этот метод является частью synthetic пакета, поэтому вам нужно импортировать его

 import kotlinx.android.synthetic.* 

Просто для уточнения. Теперь проблема исправлена. Вам не нужно передавать clearFindViewByIdCache () anylonger. См. Отслеживание проблем: https://youtrack.jetbrains.com/oauth?state=%2Fissue%2FKT-8073

Я сам нашел ответ. Класс Fragment не раздувает макет напрямую – он имеет view: View? свойства view: View? Который держит его. Это должно быть довольно очевидно, так как оно создано с помощью onCreateView . Чтобы получить доступ к свойствам в view вам необходимо установить импорт

 import kotlinx.android.synthetic.hello.view.* 

И затем получить доступ к свойствам следующим образом

 view?.text_view?.setText(text) 

Обратите внимание, что эти свойства имеют значение NULL.