gpt4 book ai didi

android - 是否可以在没有额外变量的情况下增加 mutablelivedata?

转载 作者:行者123 更新时间:2023-12-02 12:15:14 25 4
gpt4 key购买 nike

我有带有编辑文本和 2 个按钮的简单 View ,我希望用户能够使用按钮将数量增加/减少 1,或者他可以在编辑文本小部件中手动写入数量,但这个值不能小于 0 并且大于10. 我正在使用带有 LiveData 和数据绑定(bind)的 MVVM 架构。目前在 ViewModel 我有两个变量 _amount: Intamount:MutableLiveData .我正在递增/递减 _amount然后将新值分配给 MutableLiveData。它正在工作,但我想知道是否可以仅使用一个变量来存储金额,即 amount:MutableLiveData 来获得相同的结果。

View 模型

class TestActivityVM : ViewModel() {

val amount = MutableLiveData<String>()
private var _amount = 0

init {
amount.value = _amount.toString()
}

fun increment() {
Log.d("TestActivityVM", "The amount is being increment, current value = ${amount.value}")

//increment amount value by 1 if amount is less than 10
if(_amount < 10) {
amount.value = (++_amount).toString()
}
}

fun decrement() {
Log.d("TestActivityVM", "The amount is being decrement, current value = ${amount.value}")

//decrement amount value by 1 if amount is greater than 0
if(_amount > 0) {
amount.value = (--_amount).toString()
}
}

val amountValidator: TextWatcher = object : TextWatcher {
override fun afterTextChanged(s: Editable?) {
_amount = if(s.toString().isEmpty()) 0 else s.toString().toInt()

if(_amount > 10) {
_amount = 10
amount.value = _amount.toString()
}
}

override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
}

override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
}

}
}

Activity
class TestActivity : AppCompatActivity() {

private lateinit var testBinding: ActivityTestBinding
private lateinit var testVM: TestActivityVM

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

testVM = ViewModelProviders.of(this).get(TestActivityVM::class.java)

testBinding = DataBindingUtil.setContentView<ActivityTestBinding>(this, R.layout.activity_test).also {
it.lifecycleOwner = this
it.testVM = testVM
}
}
}

布局
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">

<data>

<variable
name="testVM"
type=".TestActivityVM" />
</data>


<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".TestActivity">

<Button
android:id="@+id/minusBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="16dp"
android:text="-"
android:onClick="@{() -> testVM.decrement()}"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/amountET" />

<Button
android:id="@+id/plusBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginEnd="8dp"
android:text="+"
android:onClick="@{() -> testVM.increment()}"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/amountET" />

<EditText
android:id="@+id/amountET"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:ems="10"
android:inputType="numberSigned"
android:text="@={testVM.amount}"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:addTextChangedListener="@{testVM.amountValidator}"/>

<TextView
android:id="@+id/textView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="84dp"
android:text="Value of amount Live data:"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/minusBtn" />

<TextView
android:id="@+id/textView5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="32dp"
android:layout_marginTop="8dp"
android:text="@{testVM.amount}"
android:textSize="24sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView4" />

</android.support.constraint.ConstraintLayout>
</layout>

最佳答案

您可以使用 amount.value获取当前金额,而不是使用另一个变量。 LiveData 应该是 Int,而不是 String,因为这是您要处理的数据类型。您的代码如下所示:

class TestActivityVM : ViewModel() {

val amount = MutableLiveData<Int>().apply {
value = 0
}

fun increment() {
Log.d("TestActivityVM", "The amount is being increment, current value = ${amount.value}")

//increment amount value by 1 if amount is less than 10
amount.value?.let { a ->
if (a < 10) {
amount.value = a + 1
}
}
}

关于android - 是否可以在没有额外变量的情况下增加 mutablelivedata?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57219811/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com