Skip to content

Instantly share code, notes, and snippets.

@aaronvargas
Created November 2, 2018 20:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aaronvargas/0f210ad8643b512efda4acfd524e1232 to your computer and use it in GitHub Desktop.
Save aaronvargas/0f210ad8643b512efda4acfd524e1232 to your computer and use it in GitHub Desktop.
Class to Show the preference screen with Fragment keeping state
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.preference.PreferenceFragmentCompat;
import android.support.v7.preference.PreferenceScreen;
import java.util.ArrayList;
import java.util.Objects;
import java.util.Stack;
/**
* Class to Show the preference screen with Fragment keeping state
* @author Aaron Vargas
*/
public class MyPreferencesFragmentStateful extends AppCompatActivity {
private PrefsFragment prefsFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Display the fragment as the main content. Re-Use if possible
String tag = PrefsFragment.class.getName();
prefsFragment = (PrefsFragment) getSupportFragmentManager().findFragmentByTag(tag);
if (prefsFragment == null) prefsFragment = new PrefsFragment();
getSupportFragmentManager().beginTransaction().replace(android.R.id.content,
prefsFragment, tag).commit();
}
@Override
public void onBackPressed() {
// need to delegate the backPress to the fragment since it cannot listen directly
if (!prefsFragment.onBackPressed()) {
super.onBackPressed();
}
}
public static class PrefsFragment extends PreferenceFragmentCompat {
private static final String PREFERENCE_SCREENS = "PREFERENCE_SCREENS";
private Stack<PreferenceScreen> preferenceScreens = new Stack<>();
@Override
public void onNavigateToScreen(PreferenceScreen preferenceScreen) {
super.onNavigateToScreen(preferenceScreen);
preferenceScreens.push(getPreferenceScreen());
setPreferenceScreen(preferenceScreen);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
preferenceScreens.push(getPreferenceScreen());
ArrayList<String> keys = new ArrayList<>(preferenceScreens.size());
for (PreferenceScreen screen : preferenceScreens) {
keys.add(screen.getKey());
}
outState.putStringArrayList(PREFERENCE_SCREENS, keys);
}
@Override
public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
super.onViewStateRestored(savedInstanceState);
if (savedInstanceState == null) return;
// rebuild preferenceScreen stack
for (String screenKey : Objects.requireNonNull(savedInstanceState.getStringArrayList(PREFERENCE_SCREENS))) {
preferenceScreens.push((PreferenceScreen) findPreference(screenKey));
}
if (!preferenceScreens.isEmpty()) {
PreferenceScreen preferenceScreen = preferenceScreens.pop();
if (preferenceScreen != getPreferenceScreen()) { // optimize if same
setPreferenceScreen(preferenceScreen);
}
}
}
@Override
public void onResume() {
super.onResume();
// account for onRestore not getting called equally to onSave
preferenceScreens.remove(getPreferenceScreen());
}
public boolean onBackPressed() {
// account for onRestore not getting called equally to onSave
while (preferenceScreens.contains(getPreferenceScreen())) {
preferenceScreens.remove(getPreferenceScreen());
}
if (!preferenceScreens.empty()) {
setPreferenceScreen(preferenceScreens.pop());
return true; // handled
} else {
return false;
}
}
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
setRetainInstance(true); // ensure in manifest - android:configChanges="orientation"
// Load the preferences from an XML resource
setPreferencesFromResource(R.xml.preferences, rootKey);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment