【问题标题】:Unable to retrieve input text from EditText in Android无法从 Android 中的 EditText 检索输入文本
【发布时间】:2019-05-30 17:48:03
【问题描述】:

我无法从 Android 中的 EditText 检索输入文本。 这是我的代码:

package com.example.fragments2

import ...
import com.example.fragments2.databinding.FragmentLoginPageBinding
class LoginPage : Fragment()
{

    lateinit var loginId:EditText
    lateinit var password:EditText
    lateinit var loginButton:Button

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

        {
            var binding:FragmentLoginPageBinding = DataBindingUtil.inflate(inflater,R.layout.fragment_login_page,container,false)
            var view  = binding.root
            loginId = view.findViewById(R.id.edittext_userid)
            password = view.findViewById(R.id.edittext_password)
            loginButton = view.findViewById(R.id.button_login)

            val text1: String = loginId.text.toString()
            val text2:String = password.text.toString()

        loginButton.setOnClickListener {
               Navigation.findNavController(it).navigate(LoginPageDirections.actionLoginPageToMainPage(text1,text2))
               Toast.makeText(context,text1,Toast.LENGTH_SHORT).show() //<-- shows empty string
           }

            return view
        }


}

Text1、Text2 的值始终保持为 "" 。 这段代码有什么问题?

【问题讨论】:

  • 您已经检查var view = binding.root 是否正确返回?
  • @Augusto 是的,它返回了正确的视图

标签: android kotlin android-edittext kotlin-android-extensions


【解决方案1】:

我认为点击回调 ins´t 采用您的正确实例 TextViews。尝试在点击按钮中获取这些值:

class LoginPage : Fragment()
{

    lateinit var loginId:EditText
    lateinit var password:EditText
    lateinit var loginButton:Button

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

        {
            var binding:FragmentLoginPageBinding = DataBindingUtil.inflate(inflater,R.layout.fragment_login_page,container,false)
            var view  = binding.root
            loginId = view.findViewById(R.id.edittext_userid)
            password = view.findViewById(R.id.edittext_password)
            loginButton = view.findViewById(R.id.button_login)

            loginButton.setOnClickListener {
                val text1: String = loginId.text.toString()
                val text2: String = password.text.toString()
                Navigation.findNavController(it).navigate(LoginPageDirections.actionLoginPageToMainPage(text1,text2))
                Toast.makeText(context,text1,Toast.LENGTH_SHORT).show() //<-- shows empty string
           }

           return view
        }
}

注意:也许您必须用runOnUiMainThread() 调用Toast.makeText。我已经有一段时间没有这样做了。

this.runOnUiThread {
     Toast.makeText(context,text1,Toast.LENGTH_SHORT).show() //<-- shows empty string
}

【讨论】:

    【解决方案2】:

    text1 和 text2 始终保留您在开始时为其分配的值。 如果想获取editText的文本,可以直接请求loginId.text.toString()
    否则,您可以在课程开头创建val text1: String = ""。但要更新它,您需要在TextWatcher 内部执行此操作。 看看link
    您的代码的问题是 onCreateView 仅在 Fragment 初始化时调用。但是每次文本更改时都需要更新值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多