Estou com uma dúvida sobre como resolver um questão do Preference Framework do android. Tenho uma activity e nela atachada um PreferenceFragment com uma MultiSelectListPreference em sua view. Quando o usuário aperta no label do Preference Fragment uma DialogFragment com uma lista de check boxes surge na tela. quando eu seleciono alguns itens desta lista e aperto o botão salvar os itens selecionados são salvos nas preferencias do app normalmente.Quando eu abro a FragmentDialog e seleciono vários itens desta lista e rotaciono o celular, a nova tela é recriada, a Dialog reaparece e as seleções feitas se perdem, o que aparece selecionado são o itens que já estavam salvos nas preferencias do app. Como devo proceder para restaurar as seleções feitas nessa lista da dialog quando rotaciono o celular?
Quando você rotaciona um fragment (no caso o PreferenceFragment
), ele é destruído para ser recriado. Logo antes do onDestroy
, o Android chama um método onSaveInstanceState
onde podemos salvar informações para serem recuperadas pela próxima instância desse fragment logo após o fragment ser recriado. Para recuperar a informação, basta usar o bundle
que você recebe no onCreateView
.
public class MeuFragment extends PreferenceFragment {
public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle bundle) {
if(bundle != null) {
MinhaInfo info = (MinhaInfo) bundle.getSerializable("info");
}
//...
}
public void onSaveInstanceState(Bundle bundle) {
super.onSaveInstanceState(bundle);
bundle.putSerializable("info", minhaInfoQueQueroSalvar);
}
}
Eu já havia pensado nesta possibilidade e tentei resolver a questão com o código abaixo porém não obtive resultado positivo. O MultiSelectListPreference não grava as seleções feitas na lista da dialog quando quando eu giro o celular.
public class PreferenciasFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener {
private MultiSelectListPreference listaDePreferencias;
private AvisoDeAlteracaoDePreferencias listener;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Resources res = getActivity().getResources();
addPreferencesFromResource(R.xml.preferencias);
listaDePreferencias = (MultiSelectListPreference) findPreference(res.getString(R.string.municipios_preferidos_key));
SharedPreferences preferencias = PreferenceManager.getDefaultSharedPreferences(getActivity());
preferencias.registerOnSharedPreferenceChangeListener(this);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
Log.i("valores selecionados", listaDePreferencias.getValues().toString());
}
public interface AvisoDeAlteracaoDePreferencias {
public void avisarAlteracaoDePreferencias(ArrayList<String> alteraces);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Set<String> s = new HashSet<String>();
s = listaDePreferencias.getValues();
ArrayList<String> s2 = new ArrayList<String>(s);
outState.putStringArrayList("selecoes", s2);
Log.i("SaveInstanceState", String.valueOf(s2.size()));
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (savedInstanceState != null) {
ArrayList<String> s = new ArrayList<String>();
s = savedInstanceState.getStringArrayList("selecoes");
Set<String> set = new HashSet<String>(s);
listaDePreferencias.setValues(set);
}
return super.onCreateView(inflater, container, savedInstanceState);
}
}