【发布时间】:2021-04-04 03:13:37
【问题描述】:
我一直在关注有关在 android 应用中实现 crud 功能的教程。
按照指南,提交按钮应该向我的 Firebase RTB 添加一个字符,应用程序正在编译,但当我点击提交时没有发生任何事情,我之前所做的工作我总是初始化按钮,但是当我在这里尝试这样做时我不能使用findViewById(R.id.submit),因为findViewById 会引发未解决的引用错误,如果我不声明该部分,那么它会由于未初始化而按预期崩溃。在本教程中,我关注的按钮也未初始化,但代码按预期工作。
我相信该按钮没有注册被点击,但我不完全确定它为什么不起作用。
这是我的代码
class CreatePlayerFragment: Fragment() {
private lateinit var viewModel: CharacterViewModel
private lateinit var submit: Button
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View?{
viewModel = ViewModelProvider(this).get(CharacterViewModel::class.java)
return inflater.inflate(R.layout.fragment_create_player, container, false)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
submit = clearFindViewById(R.id.submit)
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel.result.observe(viewLifecycleOwner, Observer {
val message = if(it == null) {
getString(R.string.character_added)
} else {
getString(R.string.character_failure, it.message)
}
Toast.makeText(requireContext(), message, Toast.LENGTH_SHORT).show()
})
//listener for submission button
submit.setOnClickListener {
val name: String = editTextPlayerName.text.toString().trim()
val race: String = editTextRace.text.toString().trim()
val classType: String = editTextClass.text.toString().trim()
if(TextUtils.isEmpty(name)) {
input_layout_name.error = getString(R.string.field_required_error)
return@setOnClickListener
}
val character = CharacterModel()
character.name = name
character.race = race
character.classType = classType
viewModel.addCharacter(character)
}
}
}
编辑
所以我在类中添加了 ankolistener 以查看按钮是否正在注册被点击并发现它是,我为第二个按钮创建了逻辑以清除片段中的文本字段,这按预期工作,所以我的问题是数据根本没有提交到我的 Firebase 实时数据库。 这是我的 CharacterViewModel 的代码。我正在使用 Android Studio 插件将 Firebase RTB 与此应用程序链接起来。单击提交按钮创建角色时,我没有收到任何错误。
class CharacterViewModel : ViewModel() {
private val _result = MutableLiveData<Exception?>()
val result: LiveData<Exception?>
get() = _result
/*
Add character to DB, save a character under the characters node in the DB with a
unique key id.
*/
fun addCharacter(character: CharacterModel) {
val dbCharacterModels = FirebaseDatabase.getInstance().getReference(NODE_CHARACTERS)
character.id = dbCharacterModels.push().key
dbCharacterModels.child(character.id!!).setValue(character).addOnCompleteListener {
if(it.isSuccessful){
_result.value = null
} else {
_result.value = it.exception
}
}
}
}
【问题讨论】:
-
检查教程是否使用数据绑定。
标签: android firebase kotlin android-fragments android-activity