Невозможно получить входной текст из EditText в Android

Я не могу получить входной текст из EditText в Android. Вот мой код:

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 всегда остается "" . Что не так в этом коде?


person WinterSoldier    schedule 30.05.2019    source источник
comment
Вы уже проверили, правильно ли возвращается var view = binding.root?   -  person Augusto    schedule 30.05.2019
comment
@Augusto Да, он возвращает правильный вид   -  person WinterSoldier    schedule 30.05.2019


Ответы (2)


Я думаю, что обратный вызов клика не принимает правильный экземпляр вашего 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
        }
}

Примечание. Возможно, вы должны вызвать Toast.makeText с помощью runOnUiMainThread(). Прошло некоторое время с тех пор, как я сделал это.

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

text1 и text2 всегда остаются значениями, которые вы присваиваете им в начале. Если вы хотите получить текст editText, вы можете напрямую запросить его loginId.text.toString().
В противном случае вы можете создать val text1: String = "" в начале класса. Но чтобы обновить его, вам нужно сделать это внутри TextWatcher. Взгляните на ссылку
Проблема вашего кода заключается в том, что onCreateView вызывает только при инициализации фрагмента. Но вам нужно обновлять значения каждый раз, когда ваш текст изменяется.

person samaromku    schedule 30.05.2019