android - 布局表达式中可绘制的三元运算符
问题描述
这是我的fragment_setting.xml
。
<ToggleButton
android:layout_width="47dp"
android:layout_height="27dp"
android:background="@{settingVm.isNotiOn ? @drawable/btn_on_mid : @drawable/btn_off_mid}"
android:onClick="@{()->settingVm.changeBtnStatus()}"
android:text="@string/on"
android:textOff="on"
android:textOn="on"
android:textSize="11sp"
android:textStyle="bold" />
<ToggleButton
android:layout_width="47dp"
android:layout_height="27dp"
android:background="@{settingVm.isNotiOn ? @drawable/btn_off_mid : @drawable/btn_on_mid}"
android:onClick="@{()-> settingVm.changeBtnStatus()}"
android:text="@string/off"
android:textOff="off"
android:textOn="off"
android:textSize="11sp"
android:textStyle="bold" />
这是我的SettingViewModel
class SettingViewModel(handler: SettingHandler) : ViewModel() {
var handler = handler
var isNotiOn: Boolean? = true
var visibility = View.VISIBLE
init {
if (BuildConfig.DEBUG) {
Timber.plant(Timber.DebugTree())
Timber.d("start")
}
}
fun onBackBtnPressed() {
Timber.d("onBackBtnPressed()")
handler.onBackBtnPressed()
}
fun showLogoutDialogue() {
Timber.d("showLogoutDialogue()")
handler.showLogoutDialogue()
}
fun changeBtnStatus(){
Timber.d("changeBtnStatus()")
handler.changeBtnStatus()
}
}
这是我的SettingFragment
...
val spUtil = SharedPreferenceUtil(activity!!)
when (spUtil.isNotificationOn) {
false -> {
binding!!.settingVm!!.isNotiOn = false
}
else -> {
binding!!.settingVm!!.isNotiOn = true
}
}
...
override fun changeBtnStatus() {
// TODO: Set real notification setting.
val spUtil = SharedPreferenceUtil(activity!!)
when (binding!!.settingVm!!.isNotiOn) {
true -> {
binding!!.settingVm!!.isNotiOn = false
spUtil.isNotificationOn = false
}
else -> {
binding!!.settingVm!!.isNotiOn = true
spUtil.isNotificationOn = true
}
}
}
有什么问题???我没有使用双向绑定和三元运算符,如@={}
. 但我认为我应该使用双向绑定,因为它不是一个常量值。我有两个正确的图像。
有人说我不应该使用is
前缀,因为它可能会生成getter
and setter
。所以,我什至尝试删除它并定义has
前缀,或者只是NotiOn
但没有工作。
解决方案
您可以使用 MutableLiveData 来更改状态并观察片段内部以获取实时更新,您可以根据此 LiveData 更改可绘制值
视图模型.kt
class GuestViewModel @Inject constructor(val repo: GuestRepository) : ViewModel() {
val guest = MutableLiveData<Guest>()
val guestLoading = MutableLiveData<Boolean>()
}
片段.kt
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
final TestViewModel viewModel = ViewModelProviders.of(getActivity()).get(TestViewModel.class);
viewModel.guestLoading.observe(this, it -> {
//Do something
});
}
推荐阅读
- python - 我怎样才能让这个蜘蛛为每个项目列表导出一个 JSON 文件?
- c# - 属性 UnityEngine.RequireComponent 在此声明类型上无效。它仅对类声明有效
- java - Apache POI - 如何将单元格值设置为日期格式?
- facebook - 未捕获的错误:发生缩小的异常 [Facebook 登录]
- algorithm - 如何解决递归 T(n) = T(nc) +T(c) + n^2
- rubygems - 在 Jekyll 上运行 KaTeX?
- string - 当日期格式为 yyyy-mm-dd 时,如何在 mvc core c# 中进行日期搜索?
- php - 如何从多字符串中仅获取日期
- pandas - 读取 EMNIST 数据集
- content-management-system - Umbraco VS 工艺 CMS