Вы можете найти AndroidViewModel
использования в этом случае.
То, что вы делаете, пытается поддерживать состояние между различными частями вашего приложения.
Если у вас есть AndroidViewModel
, прикрепленный к жизненному циклу активности, вы можете наблюдать это состояние в своей активности и совершать транзакции в FragmentManager
, чтобы представить свой выбор.
Пример
ViewModel
Эта ViewModel содержит данные о состоянии, для какого элемента навигации вы находитесь (представляющий Fragment
с целым числом в данном случае) и использующее целое число для представления индекса для строки вдохновения.
public class NavigationViewModel extends AndroidViewModel {
private MutableLiveData<Integer> navigationLiveData = new MutableLiveData<>();
private MutableLiveData<Integer> inspirationLiveData = new MutableLiveData<>();
public NavigationViewModel(@NonNull Application application) {
super(application);
}
public LiveData<Integer> getNavigation() {
return navigationLiveData;
}
public void setNavigation(Integer id) {
navigationLiveData.postValue(id);
}
public LiveData<Integer> getInspiration() {
return inspirationLiveData;
}
public void setInspiration(Integer id) {
inspirationLiveData.postValue(id);
}
}
Активность
Activity
будет наблюдать за навигацией LiveData
, предоставляемой нашей реализацией AndroidViewModel
. Это немедленно сообщит ему, когда будет выполнено изменение навигации.
public class NavigationActivity extends AppCompatActivity {
private NavigationViewModel navigationViewModel;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
navigationViewModel = ViewModelProviders.of(this).get(NavigationViewModel.class);
navigationViewModel.getNavigation().observe(this, id -> {
switch(id) {
case R.id.recents:
// TODO: Load recent fragment here with a transaction
break;
case R.id.top:
// TODO: Load top fragment here with a transaction
break;
case R.id.categories:
// TODO: Load categories fragment here with a transaction
break;
case R.id.inspiring:
// TODO: Load inspiring fragment here with a transaction
break;
}
});
}
}
Фрагмент вдохновения
Этот Fragment
будет учитывать индекс вдохновения, обеспечиваемый нашей реализацией AndroidViewModel
. Это позволяет ему знать, какой контент должен отображаться. Это может быть установлено от ВСЕГДА .
public class InspiringFragment extends Fragment {
private NavigationViewModel navigationViewModel;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_inspiring, container, false);
navigationViewModel = ViewModelProviders.of(this).get(NavigationViewModel.class);
navigationViewModel.getInspiration().observe(getViewLifecycleOwner(), inspiration -> {
// TODO: Update the root view UI with data gleaned using the inspiration index given here
});
return root;
}
}
Установка
Получив это, все, что вам нужно сделать, это позвонить:
navigationViewModel.setInspiration(1);
navigationViewModel.setNavigation(R.id.inspiration);
Это должно дать вам хорошую основу для начала.