问题描述
我正在尝试在加载片段后更改一些文本。它将在未来成为位置跟踪器。所以我正在测试文本的变化。
build.gradle 模块:
android {
buildFeatures{
dataBinding = true
viewBinding = true
}
}
start.xml:
<TextView
android:id="@+id/location"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true"
android:text="Current GPS Location"
android:textColor="#FF0000"
android:textSize="30sp"
android:textStyle="bold" />
开始.kt:
import android.Manifest
import android.app.Activity
import android.content.Context
import android.content.pm.PackageManager
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.TextView
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.databinding.DataBindingUtil.setContentView
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.findNavController
import com.example.basic.databinding.StartBinding
import android.util.Log
class Start : Fragment() {
private lateinit var binding: StartBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = StartBinding.inflate(layoutInflater)
binding.location.setText("Hello World")
}
}
应用程序运行没有问题,但 setText 不起作用。你知道为什么吗?
解决方法
您正在初始化绑定但未将其添加到视图
onCreateView(inflater... container...) {
binding = StartBinding.inflate(layoutInflater,container,false)
return binding.root
}
然后按照绑定之前的生命周期用法,你必须在创建视图后进行更改
onViewCreated(...) {
binding.location.setText("Hello World")
}
一个小评论,你的命名不遵循惯例:
StartFragment
fragment_start
您应该在 onCreateView
而不是 onCreate
中进行绑定,因为在 onCreate()
中还没有创建片段视图。
所以在onCreateView
下面转移
binding = StartBinding.inflate(layoutInflater)
binding.location.setText("Hello World")
欲了解更多信息,请查看 fragment lifecycle
,感谢您的回答!
解决方案非常简单。
以下是针对会发现此问题的人的解决方案:
class Start : Fragment() {
lateinit var binding : StartBinding //this must be at the begin of your class
override fun onCreateView(
inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?
): View? {
binding = StartBinding.inflate(layoutInflater,false) //this must be here in onCreateView
return binding.root
}
override fun onViewCreated(view: View,savedInstanceState: Bundle?) {
super.onViewCreated(view,savedInstanceState)
binding.textView.setText("Hello World") // and now setText works in onViewCreated
}
}