Всем привет, сейчас пишу программу с большим количеством фрагментов и с одной активити. Суть в том, что в активити постоянно меняются местами фрагменты. Все это делается при помощи одного статического метода
MainPresenter.java
public static void changeFragmentWithInfo(Fragment fragment, boolean addToBackStack, boolean refresh,
boolean hideToolbar, HashMap<String, Integer> info){
String fragmentTag = fragment.getClass().toString();
Log.d("mytag", "MainPresenter.changeFragmentWithInfo() fragmentTag = " + fragmentTag);
if(!Settings.checkIfUserLogged()){
if(fragmentTag.equals(DONATE_TAG)) {
Toast.makeText(mainActivity, R.string.donate_first_register, Toast.LENGTH_LONG).show();
Log.d("mytag", "MainPresenter.changeFragmentWithInfo() donate is blocked");
return;
}
}
if(!refresh){
if(!backStackIsNull()) {
FragmentManager.BackStackEntry lastEntry = fragmentManager.getBackStackEntryAt(fragmentManager.getBackStackEntryCount() - 1);
currentFragmentTag = lastEntry.getName();
Log.d("mytag", "MainPresenter.changeFragmentWithInfo() currentFragmentTag = " + currentFragmentTag);
if(fragmentTag.equals(currentFragmentTag)){
Log.d("mytag", "MainPresenter.changeFragmentWithInfo() return in refresh check");
return;
}
}else{
currentFragmentTag = null;
Log.d("mytag", "MainPresenter.changeFragmentWithInfo() currentFragmentTag = null");
}
}
fragmentTransaction = fragmentManager.beginTransaction();
if(addToBackStack) {
fragmentTransaction.addToBackStack(fragment.getClass().toString());
}else {
fragmentManager.popBackStack();
}
if(info != null) {
Bundle args = new Bundle();
args.putSerializable(ARG_INFO, info);
fragment.setArguments(args);
}
changeToolbarVisibility(hideToolbar);
fragmentTransaction.setTransition(TRANSIT_FRAGMENT_FADE);
fragmentTransaction.replace(R.id.content, fragment);
fragmentTransaction.commit();
}
private static boolean backStackIsNull(){
return fragmentManager.getBackStackEntryCount() == 0;
}
Settings.java
public static boolean checkIfUserLogged(){
String userToken = UserTokenStorageFactory.instance().getStorage().get();
return Backendless.UserService.CurrentUser() != null || userToken != null && !userToken.equals("");
}
Параметры входа на метод: fragment
- новый фрагмент, который должен появиться вместо старого.
addToBackStack
- Параметр, который определяет, будет ли добавлен новый фрагмент в backstack
refresh
- Параметр, показывающий нужно ли в любом случае заменить старый фрагмент на новый, ведь фишка в том, что если новый фрагмент имеет тот же класс, что и старый, то замены не происходит. Однако, иногда нужно, чтобы фрагмент обновился. Если refresh == true
то игнорируются все проверки схожести старого и нового фрагментов.
hideToolbar
- Здесь все просто и без вопросов- если нужно, чтобы в новом фрагменте был спрятан тулбар- ставим true
info
- Необходимая информация при передачи во фрагмент. Может быть null
В чем же проблема этого метода? Да в том, что все как-то очень геморно. Сейчас иногда возникает баг с наложением одного фрагмента на другой, не понимаю как фиксить. До этого уже несколько раз переписывал этот метод и все равно маялся. Как же это реализовано в профессиональных приложениях?
Виртуальный выделенный сервер (VDS) становится отличным выбором
Как у переменной типа string по индексу получить коды символов? Понятно что обращаться в цикле к индексуКак именно получить код и какой тип данных...
В android приложении по нажатию на кнопку должна начаться загрузка файла по прямой ссылке на загрузку файла( при открытии сразу предлагает сохранить...
Доброго времени сутокЕсть несколько Docker контейнеров с Jenkins, Nexus и Maven
Задание (part11task14) из книги "Talking in Java" B