Kotlin:setText 不起作用

问题描述

我正在尝试在加载片段后更改一些文本。它将在未来成为位置跟踪器。所以我正在测试文本的变化。

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
    }

}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...