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:
- Prueba de unidad en la función de extensión de Kotlin en las clases de SDK de Android
- Varargs Kotlin interoperabilidad Java no funciona correctamente
- Cómo utilizar fragmentos con kotlin
- Problemas al intentar generar aplicaciones de Kotlin con Android Studio
- Advertencia de tiempo de ejecución de Kotlin desactualizada (plugin Kotlin 1.1.2-release-Studio2.3-3)
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?
- Extensiones y fragmentos de Android de Kotlin
- Edición de Kotlin Gradle
- Android Studio 3.0 Los cambios de Kotlin no se reflejan en la compilación
- Error: Error en la ejecución de la tarea ': app: clean'. No se puede eliminar el archivo
- No se pueden resolver los métodos de registro de Anko
- Diseño sintético y personalizado de Kotlin en DialogFragment
- Este tipo tiene un constructor y debe ser inicializado aquí - Kotlin
- StackOverflowError utilizando Singleton en Kotlin
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.