Привязка данных и MVVM.Показать DatePickerDIalog, нажав на кнопку - PullRequest
0 голосов
/ 27 октября 2018

Теперь у меня есть этот код:

class MyFragment : DaggerFragment() {
    ...
    private fun setTimePickerDialog() {
        binding.timeButton.setOnClickListener{
            val calendar = viewModel.calendar
            val curHourOfDay = calendar.get(Calendar.HOUR_OF_DAY)
            val curMinute = calendar.get(Calendar.MINUTE)
            val dialog = TimePickerDialog(context, { _, hourOfDay, minute ->
                 val c = Calendar.getInstance()
                 c.set(1970, 0, 1, hourOfDay, minute)
                 viewModel.time.value = SimpleDateFormat("HH:mm:ss").format(c.time)
            }, curHourOfDay, curMinute, true)
            dialog.show()
        }
    }
    ...
}

Я хочу воспользоваться библиотекой DataBinding и не писать setOnClickListener в моем фрагменте. Но я не могу переместить этот код в ViewModel, потому что требуется контекст. Что такое чистый способ показать DatePickerDialog, нажав на кнопку, используя DataBinding и MVVM?

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

почему вы не можете использовать обработчик внутри xml вместо viewmodel. Затем получите клик, используя обработчик. В вашем XML -> используйте переменную с именем handler, тип которой является путем к вашему фрагменту

<data class ="binding">
    <variable name="handler" type="com.MyFragment"/>
</data>

android:onClick="@{()->handler.onDisplayTimePickerDialogClick()}
0 голосов
/ 27 октября 2018

То, что вы ищете, может быть достигнуто с помощью LiveData из компонента архитектуры, это также может быть сделано с помощью любых других наблюдаемых инструментов, таких как rxJava.

Первый шаг - определить наблюдаемое внаш ViewModel, и реализуя функцию, которая, когда пользователь щелкает, он вызывает наблюдаемое.

ViewModel:

MutableLiveData<Boolean> timePickerDialogData = new MutableLiveData<>();
...

public void onDisplayTimePickerDialogClick() {
    timePickerDialogData.setValue(true);
}

...
public LiveData<Boolean> getTimePickerDialogData() {
        return timePickerDialogData;
    }

Второй шаг заключается в наблюдении занаблюдаем во фрагменте и слушаем его значение изменения.когда наблюдаемое вызывается из ViewModel, мы можем отобразить диалоговое окно.

Фрагмент:

private void observeTimePickerDialogData() {
    viewModel.getTimePickerDialogData().observe(this, display -> {
    if(display) setTimePickerDialog(); // Display TimePickerDialog
    });
}

Наконец, логика onClick внутри XMLфайл макета с использованием привязки данных Android.

XML:

android:onClick="@{()->viewModel.onDisplayTimePickerDialogClick()}"

...