Я начинаю узнавать о MVVM для Android, и, хотя об этом уже много раз спрашивали, я все еще смущен одним пунктом, и чем больше я читаю, тем больше я запутался.
МойСомнение заключается в следующем:
должен ли макет XML быть «присоединен» к Activity / Fragment или ViewModel? Каким должен быть правильный подход?
1) Прикрепленный к Деятельности:
В моем XML:
<data>
<variable
name="mainView"
type="com.test.mymvvmapp.MainActivity" />
</data>
...
<Button ... android:onClick="@{()-> mainView.doSomething()}"/>
<TextView ... android:text="@{mainView.someText}" />
В моем Деятельности:
public class MainActivity extends AppCompatActivity {
public MutableLiveData<String> someText = new MutableLiveData<String>();
public MainViewModel viewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.setMainView(this);
binding.setLifecycleOwner(this);
viewModel = ViewModelProviders.of(this).get(MainViewModel.class);
viewModel.someText.observe(this, new Observer<String>() {
@Override
public void onChanged(String str) {
someText.setValue(str);
}
});
}
public void doSomething() {
viewModel.doSomething();
}
}
Это кажется мне самым чистым MVVM, наиболее логичным и правильным подходом.
2) Прикреплено к ViewModel:
В моем XML:
<data>
<variable
name="mainViewModel"
type="com.test.mymvvmapp.MainViewModel" />
</data>
...
<Button ... android:onClick="@{()-> mainViewModel.doSomething()}"/>
<TextView ... android:text="@{mainViewModel.someText}" />
В моемУпражнение:
public class MainActivity extends AppCompatActivity {
public MainViewModel viewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.setMainView(this);
binding.setLifecycleOwner(this);
}
}
Я не уверен с этим, потому что кажется, что у Задания нет цели. Но я бы сказал, что большинство учебных пособий и примеров, которые я видел, используют этот подход.
Чтобы сделать вещи более сложными, я видел примеры, которые используют оба подхода одновременно, делая это в XML:
<data>
<variable
name="mainView"
type="com.test.mymvvmapp.MainActivity" />
<variable
name="mainViewModel"
type="com.test.mymvvmapp.MainViewModel" />
</data>
...
<Button ... android:onClick="@{()-> mainView.doSomething()}"/>
<TextView ... android:text="@{mainViewModel.someText}" />
Итак, наконец, каков правильный подход? Есть ли «правильный» ответ или все они правильные и зависят от разных вещей?