【问题标题】:Accessing EditText ID data returns Null访问 EditText ID 数据返回 Null
【发布时间】:2021-08-29 11:20:23
【问题描述】:

我是 Android Kotlin 的新手,我无法访问我在 xml 中为 input_mtk ID 输入的值,它总是在 Kotlin 文件上返回 null。 这是我的代码

XML 文件

<TextView
        android:id="@+id/matematika"
        android:layout_width="wrap_content"
        android:layout_height="19dp"
        android:layout_marginStart="56dp"
        android:layout_marginTop="20dp"
        android:gravity="center_horizontal|top"
        android:text="@string/matematika"
        android:textAppearance="@style/string_form"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/input_bahasa_inggris" />

    <EditText
        android:id="@+id/input_mtk"
        style="@style/shape2"
        android:layout_marginStart="56dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="230dp"
        android:inputType="numberDecimal"
        android:maxLength="5"
        android:textAlignment="center"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/matematika" />

Kotlin 文件

class ResultFragment : Fragment() {

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

        return inflater.inflate(R.layout.fragment_result, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        getData()
    }

    fun getData() {
        var Mat = input_mtk.text.toString()
        Log.e("test", Mat)
    }
}

显示这个错误

java.lang.NullPointerException: input_mtk must not be null
        at com.xx.xx.ResultFragment.getData(ResultFragment.kt:38)
        at com.xx.xx.ResultFragment.onViewCreated(ResultFragment.kt:33)

如果我改变 var Mat = input_mtk.text.toString()var Mat = input_mtk?.text.toString()

清楚地表明 input_mtk id 返回 null 2021-08-29 16:49:22.158 15887-15887/com.xx.xx E/test: null

【问题讨论】:

  • 你在使用 dataBinding , View Binding , kotlin syntetics 吗?
  • @KaruneshPalekar 是的,我正在使用视图绑定
  • 为什么你没有在你的代码中使用绑定?你知道怎么做吗?
  • 您确定布局正确吗?我试过了,它可以工作,这应该是有效的代码。接受的答案不一定非要完成,如果它被夸大了,您可以随时从 EditText 中读取。

标签: android kotlin kotlin-android-extensions


【解决方案1】:

如果 Kotlin 合成导入或视图绑定未正确完成,input_mtk.text 可以在 onViewCreated() 中为空。 此外,在 onViewCreated() 完成执行时,您可能还没有在 EditText 中输入任何内容

把它放在按钮的点击监听器中:

<Button
        android:id="@+id/my_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

然后在您的 Kotlin 类中访问它:

var input = ""
my_button.setOnClickListener {
 input = input_mtk.text.toString()
}

这里 input 将保存来自您的 EditText 的字符串

注意:我假设您使用的是 Kotlin 合成器。如果是,建议迁移到 View Bindings - https://developer.android.com/topic/libraries/view-binding/migration

【讨论】:

    【解决方案2】:

    我真的不明白,你想做什么。

    EditText 是用户输入一些数据的视图。当您创建应用并运行它时,它有一个 null 值,也就是“没有内容”。

    如果需要,您可以在 xml 中手动添加文本:

      <EditText
            android:id="@+id/input_mtk"
            android:text="sometext"
            ... />
    

    但它的意义为零,因为此视图旨在让用户有机会输入自己的数据,并且在大多数情况下应该为空。请改用TextView

    如果要读取输入的数据,可以使用按钮:

    yourButton.setOnClickListener { input_mtk?.text.toString() }
    

    【讨论】:

      【解决方案3】:

      如果你使用 viewBinding 你可以这样做

      首先使用viewBinding

      private lateinit var binding: FragmentResultBinding
          override fun onCreateView(
              inflater: LayoutInflater, container: ViewGroup?,
              savedInstanceState: Bundle?
          ): View? {
              binding = FragmentResultBinding.inflate(inflater)
              return binding.root
          }
      

      并像这样更改函数 getData

      private fun getData(){
              val input = binding.inputMtk.text.toString()
              Log.e("FragmentResult", "getData: input: $input" )
          }
      

      【讨论】:

        猜你喜欢
        • 2017-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多