单击按钮时使用不同的数据继续更新相同的 activity
Keep updating the same activity with different data on button click
我有一个 android 应用程序可以询问用户一些问题,类似于调查。每个问题都有一个 YES
和一个 NO
Button
。因此,当用户按下 YES
或 NO
按钮时,在 YES
和 NO
按钮上可以看到一个新的 Button
以转到下一个问题。当用户单击下一个问题 button
时,它会将问题的 textview
更改为下一个问题文本,并且该问题的 imageView
也会更改。
我正在使用 DataBinding
和 LiveData
。
我已经创建了一个 list
使用的图像和另一个 list
用于我 ViewModel
class.:
中的问题
//list of images : Question 4 does not have an image
imgs= listOf(
R.drawable.imgQ1, // 1
R.drawable.imgQ2,// 2
R.drawable.imgQ3)//3
//list of questions
qs= listOf(
"What is .....?",//1
"Who is ....?",//2
"How to .....?",//3
"Why is .....?")//4
我创建了一个 ViewState
来处理何时显示哪个按钮和 UI:
sealed class MyUIState{
data class UIState(
val policyText: Boolean, // determines if the policy textview should be visible or not
val nextQuestionButton: Boolean,// determines if the next question button should be visible or not
val nextQuestionNewImage: Int = R.drawable.imgQ1,//what image is used for the next question
val nextQuestion: String //what is the next question from the list
) : MyUIState()
}
我还有一个 BindingAdapter
class 来处理可见性和文本变化以及图像变化
(基本上是这样 - 我已经通过数据绑定将这些功能添加到我的布局文件中):
@BindingAdapter("btnNextQ")
fun Button.btnNextQ(myState: MyUIState?){
visibility = if (myState is MyUIState.UIState) {
if (state.nextQuestionButton)
View.VISIBLE
else
View.GONE
} else
visibility
}
@BindingAdapter("newImage")
fun ImageView.newImage(myState: MyUIState?){
if(myStateis MyUIState.UIState){
setImageResource(state.nextQuestionNewImage)
}
}
然后在我的 ViewModel
class 中,我在 YES
或 NO
按钮上有一个点击事件函数,我调用 UIState
像这样:
//I have this declared at the top of my class (global)
private val myViewState = MutableLiveData<MyUIState>()
//this the button click for yes:
fun YesClick(){
myViewState.postValue(MyUIState.UIState(
policyText= true,
nextQuestionButton = true,
nextQuestion = qs[0])) //still keep the text for question1
}
现在,我希望在用户单击 next question
按钮后更改图像和问题。所以基本上发生的事情是,在单击下一个问题后,next question
按钮变得不可见,其他组件保持 YES
和 NO
按钮以及更新的问题和图像。这是我在下一个问题按钮上点击事件的代码:
fun nextQuestion(){
myViewState .postValue(MyUIState.UIState(
nextQuestionNewImage = imgs[1],
nextQuestion = qs[1],
nextQuestionButton = false,
policyText= false))
}
所以状态确实移动到下一个问题,必要的项目是可见的和不可见的,但我正在努力让它进入列表中的下一个问题。我可以从 question1
转到 question2
但不确定如何继续这样做直到问题列表结束。
所以基本上,我只想用新数据继续更新相同的 activity。
我们将不胜感激任何帮助或建议。
不确定我是否理解你真正的问题。也许如果您分享更多代码,我们可以更好地帮助您。
无论如何,我建议您有两种视图状态(在您的情况下为 activity),一种状态用于包含 yes
和 no
按钮的问题本身,问题文本和正确的图像。 “移至下一个”问题的另一种状态,其中包含问题文本、按钮和您想要的任何内容。
然后您的视图需要处理每个状态。在这种情况下,您需要在处理一种状态的同时处理另一种状态,例如显示一个按钮并隐藏不需要的按钮。
因此,无论何时单击 yes
按钮,VM 都会获取事件,检查所有内容,然后将事件发送回具有新状态的视图,依此类推。
这与您所做的完全相同,但是使用两个状态将帮助您处理每个状态并简化您的代码
我有一个 android 应用程序可以询问用户一些问题,类似于调查。每个问题都有一个 YES
和一个 NO
Button
。因此,当用户按下 YES
或 NO
按钮时,在 YES
和 NO
按钮上可以看到一个新的 Button
以转到下一个问题。当用户单击下一个问题 button
时,它会将问题的 textview
更改为下一个问题文本,并且该问题的 imageView
也会更改。
我正在使用 DataBinding
和 LiveData
。
我已经创建了一个 list
使用的图像和另一个 list
用于我 ViewModel
class.:
//list of images : Question 4 does not have an image
imgs= listOf(
R.drawable.imgQ1, // 1
R.drawable.imgQ2,// 2
R.drawable.imgQ3)//3
//list of questions
qs= listOf(
"What is .....?",//1
"Who is ....?",//2
"How to .....?",//3
"Why is .....?")//4
我创建了一个 ViewState
来处理何时显示哪个按钮和 UI:
sealed class MyUIState{
data class UIState(
val policyText: Boolean, // determines if the policy textview should be visible or not
val nextQuestionButton: Boolean,// determines if the next question button should be visible or not
val nextQuestionNewImage: Int = R.drawable.imgQ1,//what image is used for the next question
val nextQuestion: String //what is the next question from the list
) : MyUIState()
}
我还有一个 BindingAdapter
class 来处理可见性和文本变化以及图像变化
(基本上是这样 - 我已经通过数据绑定将这些功能添加到我的布局文件中):
@BindingAdapter("btnNextQ")
fun Button.btnNextQ(myState: MyUIState?){
visibility = if (myState is MyUIState.UIState) {
if (state.nextQuestionButton)
View.VISIBLE
else
View.GONE
} else
visibility
}
@BindingAdapter("newImage")
fun ImageView.newImage(myState: MyUIState?){
if(myStateis MyUIState.UIState){
setImageResource(state.nextQuestionNewImage)
}
}
然后在我的 ViewModel
class 中,我在 YES
或 NO
按钮上有一个点击事件函数,我调用 UIState
像这样:
//I have this declared at the top of my class (global)
private val myViewState = MutableLiveData<MyUIState>()
//this the button click for yes:
fun YesClick(){
myViewState.postValue(MyUIState.UIState(
policyText= true,
nextQuestionButton = true,
nextQuestion = qs[0])) //still keep the text for question1
}
现在,我希望在用户单击 next question
按钮后更改图像和问题。所以基本上发生的事情是,在单击下一个问题后,next question
按钮变得不可见,其他组件保持 YES
和 NO
按钮以及更新的问题和图像。这是我在下一个问题按钮上点击事件的代码:
fun nextQuestion(){
myViewState .postValue(MyUIState.UIState(
nextQuestionNewImage = imgs[1],
nextQuestion = qs[1],
nextQuestionButton = false,
policyText= false))
}
所以状态确实移动到下一个问题,必要的项目是可见的和不可见的,但我正在努力让它进入列表中的下一个问题。我可以从 question1
转到 question2
但不确定如何继续这样做直到问题列表结束。
所以基本上,我只想用新数据继续更新相同的 activity。
我们将不胜感激任何帮助或建议。
不确定我是否理解你真正的问题。也许如果您分享更多代码,我们可以更好地帮助您。
无论如何,我建议您有两种视图状态(在您的情况下为 activity),一种状态用于包含 yes
和 no
按钮的问题本身,问题文本和正确的图像。 “移至下一个”问题的另一种状态,其中包含问题文本、按钮和您想要的任何内容。
然后您的视图需要处理每个状态。在这种情况下,您需要在处理一种状态的同时处理另一种状态,例如显示一个按钮并隐藏不需要的按钮。
因此,无论何时单击 yes
按钮,VM 都会获取事件,检查所有内容,然后将事件发送回具有新状态的视图,依此类推。
这与您所做的完全相同,但是使用两个状态将帮助您处理每个状态并简化您的代码