I'm quite new to Android development, and I've looked at the similar posts but I still can't get this to work. I can't retrieve SharedPreferences when specifying a preference file, which I try to do in PrefFragment
and that's where SharedPreferences.getAll().size()
returns 0.
src/main/res/xml/things.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory app:title="things_category">
<SwitchPreference
app:key="thing"
app:title="thing"
/>
<Preference
app:fragment="org.thing.appo.PrefFragment2"
app:key="more_things_menu"
android:title="more things menu"/>
</PreferenceCategory>
</PreferenceScreen>
src/main/res/xml/more_things.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<SwitchPreference
app:key="more_things"
app:title="more things"
/>
</PreferenceScreen>
src/main/res/values/strings.xml
<resources>
<string name="app_name">appo</string>
<string name="things">things</string>
<string name="more_things">more_things</string>
</resources>
MainActivity
public class MainActivity extends AppCompatActivity implements
PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (findViewById(R.id.fragment_container) != null) {
if (savedInstanceState != null) {
return;
}
getSupportFragmentManager()
.beginTransaction()
.add(R.id.fragment_container, new PrefFragment())
.commit();
}
}
@Override
public boolean onPreferenceStartFragment(PreferenceFragmentCompat caller, Preference pref) {
final Fragment fragment = getSupportFragmentManager().getFragmentFactory().instantiate(
getClassLoader(),
pref.getFragment());
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment_container, fragment)
.addToBackStack(null)
.commit();
return true;
}
}
PrefFragment
public class PrefFragment extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String key) {
setPreferencesFromResource(R.xml.things, key);
Map<String, ?> things = getActivity().getSharedPreferences(getString(R.string.things), Context.MODE_PRIVATE).getAll();
System.out.println("things.size() = " + things.size()); // returns 0
Map<String, ?> moreThings = getActivity().getSharedPreferences(getString(R.string.more_things), Context.MODE_PRIVATE).getAll();
System.out.println("moreThings = " + moreThings.size()); // returns 0
Map<String, ?> all = PreferenceManager.getDefaultSharedPreferences(getActivity()).getAll();
System.out.println("all.size() = " + all.size()); // But here it returns 2
}
}
PrefFragment2
public class PrefFragment2 extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String key) {
setPreferencesFromResource(R.xml.more_things, key);
}
}