I have an app project where there is 10 Fragments. When user open a Fragment I want to in code know this and save the Fragment as the last Fragment user has visited.
If user close app and open it again this last visited Fragment will be showed to user.
I read many answers about this and there does not seam to be a consensus on a solution to know what Fragment is currently visible for User.
I was thinking to subclass FragmentManager maybe to detect popping and monitor queue state.
Or maybe put some GestureDetector.OnGestureListener
in the Fragment
and when that fires I can save the last Fragment user has visited.
Any help on this would be grate
This is what happen when user in the Fragment press back press button
/**
* user press back button
*/
@Override
public void onBackPressed() {
//Fragment fragment = getVisibleFragment();
//get the name from the topmost BackStackEntry which is also the fragment tag.
String fragmentTag = mFragManager.getBackStackEntryAt(mFragManager.getBackStackEntryCount()-1).getName();
Fragment currentFrag = mFragManager.findFragmentByTag(fragmentTag);
if (currentFrag == null ) {
super.onBackPressed();
}
if (currentFrag != null) {
if (currentFrag.getTag().equals(SettingsManager.FragmentsModel.CHAT_FRAGMENT.toString())) {
if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
openDrawer(false);
} else
requestBeginTransaction(SettingsManager.FragmentsModel.LAUNCHER_FRAGMENT.toString(), true, false);
} else if (currentFrag.getTag().equals(SettingsManager.FragmentsModel.BILLBOARD_FRAGMENT.toString())) {
} else if (currentFrag.getTag().equals(SettingsManager.FragmentsModel.NEWS_FRAGMENT.toString())) {
} else if (currentFrag.getTag().equals(SettingsManager.FragmentsModel.INFO_FRAGMENT.toString())) {
super.onBackPressed();
} else if (currentFrag.getTag().equals(SettingsManager.FragmentsModel.SEARCH_FRAGMENT.toString())) {
// exit app if the search address view is visible
if (currentFrag.getView().findViewById(R.id.search_address_layout).getVisibility() == View.VISIBLE) {
exitApp();
} else if (currentFrag.getView().findViewById(R.id.show_search_result_layout).getVisibility() == View.VISIBLE) {
// show search address view if Address already exist view is visible
currentFrag.getView().findViewById(R.id.search_address_layout).setVisibility(View.VISIBLE);
currentFrag.getView().findViewById(R.id.history).setVisibility(View.VISIBLE);
currentFrag.getView().findViewById(R.id.show_search_result_layout).setVisibility(View.INVISIBLE);
((SearchFragment)currentFrag).onSearchLayoutVisible();
}
} else if (currentFrag.getTag().equals(SettingsManager.FragmentsModel.PREFERENCE_FRAGMENT.toString())) {
super.onBackPressed();
//requestBeginTransaction(SettingsManager.FragmentsModel.LAUNCHER_FRAGMENT.toString(), true, false);
} else if (currentFrag.getTag().equals(SettingsManager.FragmentsModel.PREFERENCE_FRAGMENT_CHAT_SETTINGS.toString())) {
super.onBackPressed();
//requestBeginTransaction(SettingsManager.FragmentsModel.LAUNCHER_FRAGMENT.toString(), true, false);
} else if (currentFrag.getTag().equals(SettingsManager.FragmentsModel.PREFERENCE_FRAGMENT_THEME_SETTINGS.toString())) {
super.onBackPressed();
//requestBeginTransaction(SettingsManager.FragmentsModel.LAUNCHER_FRAGMENT.toString(), true, false);
} else if (currentFrag.getTag().equals(SettingsManager.FragmentsModel.LAUNCHER_FRAGMENT.toString())) {
super.onBackPressed();
//requestBeginTransaction(SettingsManager.FragmentsModel.LAUNCHER_FRAGMENT.toString(), true, false);
}
} else
exitApp();
}
In the code above i pop Fragment and dont know what Fragment is under the popt Fragment.
Here is when I add or show Fragment
/**
* Change the current displayed fragment by a new one.
* - if the fragment is in backstack, it will pop it
* - if the fragment is already displayed (trying to change the fragment with the same), it will not do anything
*
* @param backStateName the new fragment to display
* @param saveInBackstack if we want the fragment to be in backstack
* @param animate if we want a nice animation or not
*/
public void requestBeginTransaction(String backStateName, boolean saveInBackstack, boolean animate) {
Fragment frag = null;
if (mFragManager.findFragmentByTag(backStateName) != null) {
frag = mFragManager.findFragmentByTag(backStateName);
} else
try {
frag = (Fragment) Class.forName(backStateName).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
FragmentManager manager = getSupportFragmentManager();
boolean fragmentPopped = manager.popBackStackImmediate(backStateName, 0);
if (!fragmentPopped && manager.findFragmentByTag(backStateName) == null) {
//fragment not in back stack, create it.
FragmentTransaction transaction = manager.beginTransaction();
if (animate) {
LogManager.d(this, "Change Fragment: animate");
// transaction.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right);
}
transaction.add(R.id.frame, frag, backStateName);
if (saveInBackstack) {
LogManager.d(this, "Change Fragment: addToBackTack " + backStateName);
transaction.addToBackStack(backStateName);
LogManager.d(this, "Change Fragment: NO addToBackTack");
}
transaction.commit();
} else {
mFragManager.beginTransaction().show(mFragManager.findFragmentByTag(backStateName)).commit();
// custom effect if fragment is already instanciated
}
} catch (IllegalStateException exception) {
LogManager.w(this, "Unable to commit fragment, could be activity as been killed in background. " + exception.toString());
}
}