#android #android-activity #mvvm #fragment
#Android #android-активность #mvvm #фрагмент
Вопрос:
Я применяю шаблон MVVM в собственной разработке Android. У меня есть LoginActivity, и в нем будут размещены два разных фрагмента: LoginFragment и RegisterFragment. Я не уверен, что делать в этом случае. ViewModel для LoginActivity или две разные ViewModel для двух фрагментов. Если я создам одну ViewModel для activity, привязки и логики представления login и register будут смешиваться друг с другом. Но во многих руководствах разработчики говорят, что мы должны создавать одну viewmodel для каждого действия и получать доступ к этим viewmodels из fragment. Как я должен справиться с этим здесь?
Мой фрагмент входа в систему, если необходимо
public class LoginFragment extends Fragment {
private LoginViewModel loginViewModel;
public LoginFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
FragmentLoginBinding fragmentLoginBinding = DataBindingUtil.setContentView(getActivity(), R.layout.fragment_login);
loginViewModel = ViewModelProviders.of(this, new LoginViewModelFactory(getActivity().getApplication(),
LoginRepository.getInstance())).get(LoginViewModel.class);
fragmentLoginBinding.setViewModel(loginViewModel);
fragmentLoginBinding.executePendingBindings();
return inflater.inflate(R.layout.fragment_login, container, false);
}
}
и LoginActivity
public class LoginActivity extends AppCompatActivity {
private LoginViewModel loginViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
FragmentUtil.replaceFragment(getSupportFragmentManager(), R.id.entry_frame, new LoginFragment(), "login");
}
}
Комментарии:
1. Я предпочитаю создавать две viewmodels, потому что экраны разные, имеют разные функции… если вы завершили какой-то процесс и он необходим для связи с действием, вы можете поделиться этой viewmodels и использовать livedata для уведомления о действии: закрыть, следующий шаг, предыдущий шаг и т.д.
Ответ №1:
Один из способов получить доступ к Activity ViewModel — это вызвать getActivity во фрагменте, затем преобразовать его в класс, который у вас есть, и получить доступ к ОБЩЕДОСТУПНОМУ свойству ViewModel.
Я не знаю вашего точного варианта использования, но я мог бы использовать несколько фрагментов и иметь репозиторий выше тех, в которых есть некоторая общая логика.
Вы можете убрать часть шаблона из нескольких фрагментов, выполнив их следующим образом:
Ответ №2:
На мой взгляд, вам следует создать две разные ViewModel. Потому что ViewModel предназначен для хранения и управления данными, связанными с пользовательским интерфейсом, в жизненном цикле действия или фрагмента. Сделайте это, чтобы помочь вам независимой и простой в управлении логикой.
Если вы хотите обмениваться данными между фрагментом и активностью или фрагментом и фрагментом, вы можете увидеть: