这是我的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
和setter
。因此,我什至尝试删除它并定义has
前缀或仅定义NotiOn
,但是没有用。
答案 0 :(得分:0)
您可以使用MutableLiveData来更改状态,并观察片段内部以进行实时更新,并且可以根据此LiveData更改可绘制值
ViewModel.kt
class GuestViewModel @Inject constructor(val repo: GuestRepository) : ViewModel() {
val guest = MutableLiveData<Guest>()
val guestLoading = MutableLiveData<Boolean>()
}
Fragment.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
});
}
答案 1 :(得分:0)
请尝试一次此代码##您的XML应该在代码中是这样
<ToggleButton
android:layout_width="match_parent"
android:layout_height="match_parent"
android:button="@{settingVm.isNotiOn ? @drawable/btn_on_mid : @drawable/btn_off_mid}"/>
和以下Java代码,您可以减少并以正确的形式获得结果。请在片段类上使用此代码。
val spUtil = SharedPreferenceUtil(activity!!) tbutton.setOnCheckedChangeListener { buttonView, isChecked -> spUtil.isNotificationOn = isChecked binding!!.settingVm!!.isNotiOn = isChecked }
================================================ =======================