gpt4 book ai didi

android - 太多的 XML 数据绑定(bind)

转载 作者:太空宇宙 更新时间:2023-11-03 13:39:29 25 4
gpt4 key购买 nike

我制作了一个 View,我想在多个页面中重复使用它。它包含用户的反馈元素,例如 ProgressBarTextView 等。

由于里面的元素很多,绑定(bind)所有这些结果是这样的:

<layout ... >

<data>
<variable
name="screenObserver"
type="my.namespace.ScreenStateObserver" />
</data>


<androidx.constraintlayout.widget.ConstraintLayout ... >

<my.namespace.view.ScreenStateView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:loading="@{screenObserver.isProgressVisible}"
app:errorText="@{screenObserver.errorTxt}"
app:buttonText="@{screenObserver.errorBtnTxt}"
app:errorVisible="@{screenObserver.isTextVisible}"
app:buttonVisible="@{screenObserver.isButtonVisible}"
app:onButtonClick="@{() -> screenObserver.onErrorResolve()}" />

</androidx.constraintlayout.widget.ConstraintLayout>

</layout>

我发现复制/粘贴整个 XML block 很麻烦且容易出错。有什么办法可以使这更简单吗?

ScreenStateObserver 只是我在 ViewModel 中实现的一个接口(interface),绑定(bind)如下:

override fun onCreateView(...): View? {

val factory = InjectorUtils.provideViewModelFactory()
viewmodel = ViewModelProviders.of(this, factory).get(MyViewModel::class.java)
binding = MyFragmentBinding.inflate(inflater, container, false).apply {
screenObserver = viewmodel
}
}
class AtoZViewModel() : ViewModel(), ScreenStateObserver { ... }
interface ScreenStateObserver {
val isProgressVisible : MutableLiveData<Boolean>
val isTextVisible : MutableLiveData<Boolean>
val isButtonVisible : MutableLiveData<Boolean>

// [..]
}

谢谢!

最佳答案

这是我减少代码的建议。
首先像这样声明一个类

interface ScreenState {

class Loading : ScreenState

class Error(val errorMessage: String, val errorButtonText: String) : ScreenState
}

在你的 CustomView 里面,它会是

internal class ScreenStateView {

fun setState(state: ScreenState) {
if (state is ScreenState.Loading) {
// show loading
} else {
// hide loading
}

if (state is ScreenState.Error) {
//show {state.errorMessage} and {state.errorButtonText}
} else {
// hide error
}
}
}

在xml中使用

    <my.namespace.view.ScreenStateView
...
app:state="@{screenObserver.screenState}"
...
app:onButtonClick="@{() -> screenObserver.onErrorResolve()}" /> // for onButtonClick I think it still better if we keep like this

希望对你有帮助

关于android - 太多的 XML 数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57092569/

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