Created
November 2, 2018 20:11
-
-
Save aaronvargas/0f210ad8643b512efda4acfd524e1232 to your computer and use it in GitHub Desktop.
Class to Show the preference screen with Fragment keeping state
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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