想要在使用传递 LatLon 的实时数据时为 textView 添加延迟



正在使用 MutableLiveData 在服务之间传递数据到片段。 根据 Log.d 语句接收数据。 但是当我尝试使用文本视图显示数据时,我得到 null。它认为延迟使其无效。有没有办法延迟或更新文本视图,以便我可以显示数据?

DashbordFragment.kt

class DashbordFragment : Fragment() {
private var locationList = mutableListOf<LatLng>()
var liveLatLng = MutableLiveData<LatLng>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(true)
sendActionCommandToService(Constants.ACTION_SERVICE_START)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
observerTrackerService()
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_dashbord, container, false)
}
lateinit var binding : FragmentDashbordBinding
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding = FragmentDashbordBinding.bind(view)
binding.btGotostation.setOnClickListener {
startActivity(Intent(requireContext(),StationsActivity::class.java))
}
binding.btGotostatistics.setOnClickListener {
findNavController().navigate(DashbordFragmentDirections.actionDashbordFragmentToStatisticsFragment())
}
binding.btGotolinediagram.setOnClickListener {
findNavController().navigate(DashbordFragmentDirections.actionDashbordFragmentToLineDiagramFragment())
}
binding.btMap.setOnClickListener {
findNavController().navigate(DashbordFragmentDirections.actionDashbordFragmentToMapsFragment())
}
binding.latlon.text = liveLatLng.value.toString()

}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.dashboard_menu, menu)
super.onCreateOptionsMenu(menu, inflater)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return super.onOptionsItemSelected(item)
}
private fun observerTrackerService(){
TrackerService.locationList.observe(viewLifecycleOwner) {
if (it != null) {
locationList = it
Log.d("LocationList",locationList.toString())
}
}
TrackerService.liveLatLng.observe(viewLifecycleOwner){
Log.d("LiveLatLng", it.toString())
}
Log.d("LocationList", "Tester")
}
private fun sendActionCommandToService(action: String){
Intent(
requireContext(),
TrackerService::class.java
).apply {
this.action = action
requireContext().startService(this)
}
}
<小时 />

fragment_dashbord.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>

<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="top|center"
android:text="@string/dashboard"
android:textAlignment="center"
android:textAppearance="@style/TextAppearance.AppCompat.Large" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/go_to_station"
android:layout_marginStart="24dp"
android:layout_marginTop="54dp"
android:id="@+id/bt_gotostation"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/GoogleMap"
android:layout_marginStart="24dp"
android:layout_marginTop="140dp"
android:id="@+id/btMap"/>
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/statistics_desc"
android:layout_marginTop="240dp"
android:textAlignment="center"
android:textAppearance="@style/TextAppearance.AppCompat.Medium" />

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/development_bar_chart"
android:layout_marginStart="24dp"
android:layout_marginTop="290dp"
android:id="@+id/bt_gotostatistics"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/development_line_diagram"
android:layout_marginStart="24dp"
android:layout_marginTop="360dp"
android:id="@+id/bt_gotolinediagram"/>
<TextView
android:id="@+id/latlon"
android:layout_width="100dp"
android:layout_height="100dp"
android:text="@string/statistics_desc"
android:layout_marginTop="500dp"
android:textAlignment="center"
android:textAppearance="@style/TextAppearance.AppCompat.Medium" />
</FrameLayout>

您是在收到数据之前调用的onViewCreated中设置此设置。 相反,您可以在onViewCreated中按如下方式设置观察者 例:

liveLatLng.observe(this , Observer {
it?.let{
binding.latlon.text = it.toString()
}
})

并按如下方式设置值

TrackerService.liveLatLng.observe(viewLifecycleOwner){
liveLatLng.value = it // hoping this is of type LatLng
}

注意:根据安卓开发文档考虑这一点

确保在视图模型中存储更新 UI 的 LiveData 对象 对象,而不是活动或片段,用于以下 原因:避免臃肿的活动和碎片。现在这些用户界面 控制器负责显示数据但不保存数据 州。将 LiveData 实例与特定活动分离,或 对实例进行分段并允许 LiveData 对象在配置中幸存下来 变化。

来自开发人员文档

这个binding.latlon.text = liveLatLng.value.toString()与livedata没有任何共同之处。如果使用得当,您的代码应该看起来像这样binding.latlon = liveLatLng并且不需要延迟,LiveData会为您完成。要达到这个目的,你需要检查LiveData,DataBinding和BindingAdapter。

所需绑定变量的小提示

<import type="com.google.type.LatLng" />
<variable
name="latlon"
type="androidx.lifecycle.MutableLiveData&lt;LatLng&gt;" />

最新更新