Я - любитель MVP, но в то же время я открытый и пытаюсь улучшить свои знания о MVVM и привязке данных:
Я разветвлен здесь https://github.com/jpgpuyo/MVPvsMVVM
оригинальное репо https://github.com/florina-muntenescu/MVPvsMVVM от @ FMuntenescu
Я создал несколько веток.В одном из них я хочу показать 2 разных диалоговых окна оповещений с разными стилями в зависимости от количества нажатий кнопки:
- четное количество нажатий -> показать стандартное диалоговое окно
- нечетное количество кликов -> показать диалог droidcon
Вы можете найти ветку здесь: https://github.com/jpgpuyo/MVPvsMVVM/tree/multiple_dialogs_databinding_different_style
Я создал 2 наблюдаемых поля в модели представления и добавил одну привязкуадаптер.
Активность:
private void setupViews() {
buttonGreeting = findViewById(R.id.buttonGreeting);
buttonGreeting.setOnClickListener(v -> mViewModel.onGreetingClicked());
}
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
app:greetingType="@{viewModel.greetingType}"
app:greetingMessage="@{viewModel.greetingMessage}">
ViewModel:
public ObservableField<String> greetingMessage = new ObservableField<>();
public ObservableField<GreetingType> greetingType = new ObservableField<>();
public void onGreetingClicked() {
numberOfClicks++;
if (numberOfClicks % 2 == 0) {
mSubscription.add(mDataModel.getStandardGreeting()
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(greeting -> {
greetingMessage.set(greeting);
greetingType.set(GreetingType.STANDARD);
}));
} else {
mSubscription.add(mDataModel.getDroidconGreeting()
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(greeting -> {
greetingMessage.set(greeting);
greetingType.set(GreetingType.DROIDCON);
}));
}
}
MVVMBindingAdapter:
@BindingAdapter({"greetingType", "greetingMessage"})
public static void showAlertDialog(View view, GreetingType greetingType,
String greetingMessage) {
if (GreetingType.STANDARD.equals(greetingType)){
new DialogHelper().showStandardGreetingDialog(view.getContext(),
greetingMessage, greetingMessage);
} else if(GreetingType.DROIDCON.equals(greetingType)) {
new DialogHelper().showDroidconGreetingDialog(view.getContext(),
greetingMessage, greetingMessage);
}
}
С MVVM не уверен вкак реализовать это, чтобы быть полностью тестируемым с модульными тестами Java.Я создал адаптер привязки, но затем:
Мне нужен адаптер if / else в адаптере привязки для отображения того или иного диалога.
Я не знаю, как внедрить помощника диалога в адаптер привязки, поэтому я не могу проверить с помощью модульных тестов, кроме как с помощью powermock.
Я добавил разные стили для каждого диалога,потому что, если я не ставлю стили, мы можем считать, что заголовок и сообщение из диалога извлекаются из слоя данных, но было бы странно считать, что стиль андроида взят из слоя данных.
Это нормально, введитедиалог помощника в MVVM, чтобы решить эту проблему и сделать код тестируемым?
Как лучше всего управлять диалоговыми окнами оповещений с помощью MVVM?