Kotlin Android扩展和保留片段

Lam*_*rak 9 android android-layout android-fragments kotlin kotlin-android-extensions

我在我的项目中使用Kotlin Android扩展,我遇到了一些我无法理解的行为.我使用此代码将我的片段保留在活动中:

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

这是保留的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
    }
}
Run Code Online (Sandbox Code Playgroud)

和它的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" />
Run Code Online (Sandbox Code Playgroud)

一切都按预期工作 - text_view.setText()显示Hello world!在第一次发布的屏幕上.但是当你旋转屏幕时,text_view.setText()它不起作用.这很奇怪,因为text_view它不是可空的,必须考虑到某种观点.如果删除setRetainInstance(true)并在每次此问题消失时重新创建片段.有什么想法会导致这个问题吗?

yan*_*nex 15

UPD:现在问题已解决.您不必再clearFindViewByIdCache()手动呼叫.

View调用后不会清除缓存onDestroyView().有一个未解决的问题.

现在,您可以显式调用clearFindViewByIdCache()onDestroyView()清除缓存.此方法是synthetic包的一部分,因此您必须导入它

import kotlinx.android.synthetic.*
Run Code Online (Sandbox Code Playgroud)


gre*_*and 7

只是为了澄清.这个问题现在已经解决了.您不必再传递clearFindViewByIdCache().请参阅问题跟踪器:https://youtrack.jetbrains.com/oauth? state =% 2Fissue%2FKT- 8073


Lam*_*rak 5

我自己找到了答案。本Fragment类不直接膨胀布局-它拥有财产view: View?持有它。这是很明显的,因为它是使用创建的onCreateView。为了访问其中的属性,view您必须设置导入

import kotlinx.android.synthetic.hello.view.*
Run Code Online (Sandbox Code Playgroud)

然后按如下方式访问属性

view?.text_view?.setText(text)
Run Code Online (Sandbox Code Playgroud)

请注意,这些属性可以为空。