我在我的项目中使用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
它不能为空并且必须参考一些观点。如果您删除setRetainInstance(true)
并保留片段,则每次此问题消失时都会重新创建。有什么想法可能导致这个问题吗?