我试图在加载片段后改变一些文本。这将是未来的位置跟踪器。所以我在测试文本的变化
构建。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" />
Start.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")
更多信息请查看片段生命周期
谢谢你的回答!
解决方法很简单。
下面是解决这个问题的方法:
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,container,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
}
}