троичный оператор для рисования в выражении макета - PullRequest
2 голосов
/ 14 июня 2019

Это мой 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, но не сработал.

Ответы [ 2 ]

0 голосов
/ 14 июня 2019

Пожалуйста, попробуйте этот код один раз ## Ваш 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 }

=============================================== =========================

0 голосов
/ 14 июня 2019

Вы можете использовать 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
    });
}
...