Extensiones de Kotlin Android y fragmento retenido

Estoy usando las extensiones de Kotlin Android en mi proyecto y me encontré con un comportamiento que no puedo entender. Yo uso este código para retener mi fragmento en la actividad:

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

Este es el Fragment retenido:

 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 } } 

Y su diseño 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" /> 

Todo funciona como se espera – el text_view.setText() muestra Hola mundo! En la pantalla en el primer lanzamiento. Pero cuando gira la pantalla, text_view.setText() no funciona. Esto es raro porque text_view no es anulable y tiene que referirse a alguna vista. Si quita setRetainInstance(true) y deja el fragmento volver a crear cada vez que desaparece este problema. ¿Alguna idea de lo que podría causar este problema?

View caché de la View no se despeja después de llamar onDestroyView() . Hay un problema abierto .

Por ahora, puede invocar explícitamente clearFindViewByIdCache() en onDestroyView() para borrar la caché. Este método forma parte del paquete synthetic , por lo que debe importarlo

 import kotlinx.android.synthetic.* 

Solo para aclarar. El problema está arreglado ahora. No tiene que pasar clearFindViewByIdCache () anylonger. Consulta el tema de seguimiento: https://youtrack.jetbrains.com/oauth?state=%2Fissue%2FKT-8073

He encontrado la respuesta yo mismo. La clase Fragment no infla directamente el diseño: tiene view: View? propiedad view: View? Que lo sostiene. Esto debería ser bastante obvio ya que se crea con onCreateView . Para tener acceso a las propiedades dentro de la view usted tiene que fijar la importación

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

Y luego acceder a las propiedades de la siguiente manera

 view?.text_view?.setText(text) 

Tenga en cuenta que estas propiedades son anulables.

  • ¿Kotlin Android Extensions pone en caché las propiedades sintéticas o cada vez que llama a findViewById ()?
  • Android Kotlin: java.lang.NoClassDefFoundError: Resolución fallida de: <KotlinObject>
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.