Я не могу получить входной текст из 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 всегда остается "". Что не так в этом коде?
@Augusto Да, он возвращает правильный вид
text1 и text2 всегда остаются значениями, которые вы присваиваете им в начале.
Если вы хотите получить текст editText, вы можете напрямую запросить его loginId.text.toString()
.
В противном случае вы можете создать val text1: String = ""
в начале урока. Но чтобы обновить его, вам нужно сделать это внутри TextWatcher
.
Взгляните на связь
Проблема вашего кода заключается в том, что onCreateView вызывается только при инициализации Fragment. Но вам нужно обновлять значения каждый раз, когда ваш текст изменяется.
Я думаю, что обратный вызов клика не соответствует вашему экземпляру 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
}
Вы уже проверили, правильно ли возвращается
var view = binding.root
?