How to read/write preferences from a DialogFragment?

android, android-alertdialog, android-dialogfragment, android-preferences

Solution

Use `getActivity()` since `Activity` extends `Context`, and `Context` has a `getSharedPreferences()` method.

prefs = getActivity().getSharedPreferences("numberPicker.preferences", 0);

I'd also recommend keeping a reference to the Editor object to ensure proper saving.

SharedPreferences.Editor editor = prefs.edit();
editor.putInt("BAAN_01", baan1);
editor.putInt("BAAN_02", baan2);

// Commit the edits!
editor.commit();

or chain:

prefs.edit()
  .putInt("BAAN_01", baan1)
  .putInt("BAAN_02", baan2)
  .commit();

Problem

I want to read from a preferences file in a DialogFragment. If I do this: ``` prefs = getSharedPreferences("numberPicker.preferences", 0); ``` then I get a compile time error, because getSharedReference is a ContextWrapper method but DialogFragment isn't a ContextWrapper (I use android.support.v4.app.DialogFragment for backwards compatibility by the way). If alternatively, as a 'workaround', I use a SharedPreferences object prefs created in a class InitSpel (which is a FragmentActivity and therefore IS a ContextWrapper) then I get no error (nor at compile time nor at runtime) however the values are not stored (next time I start the app the values baan1 and baan2 are still 0). How to solve? ``` package mypackage; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.content.ComponentName; import android.content.DialogInterface; import android.content.SharedPreferences; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.support.v4.app.FragmentActivity; import android.view.LayoutInflater; import android.view.View; import android.widget.EditText; public class VraagBanenDialogFragment extends DialogFragment { private View v; private EditText editText1; private EditText editText2; //private ArrayList<Baan> baanNummers; private int[] oldBanen; private int[] currentBanen; private SharedPreferences prefs; /* public VraagBanenDialogFragment(ArrayList<Baan> baanNummers) { this.baanNummers = baanNummers; } */ @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); // Restore preferences //prefs = InitSpel.prefs; prefs = getSharedPreferences("numberPicker.preferences", 0); int baan1 = prefs.getInt( "BAAN_01", 0 ); int baan2 = prefs.getInt( "BAAN_02", 0 ); //oldBanen = new int[InitSpel.aantalParallel]; oldBanen = new int[2]; oldBanen[0] = baan1; oldBanen[1] = baan2; // Get the layout inflater LayoutInflater inflater = getActivity().getLayoutInflater(); // Inflate and set the layout for the dialog // Pass null as the parent view because its going in the dialog layout v = inflater.inflate(R.layout.vraag_banen, null); // velden vullen met opgeslagen waarden editText1 = (EditText) v.findViewById(R.id.editText1); editText2 = (EditText) v.findViewById(R.id.editText2); editText1.setText(String.valueOf(baan1)); editText2.setText(String.valueOf(baan2)); //editText1.setText(String.valueOf(baanNummers.get(0).getBaanNummer())); //editText2.setText(String.valueOf(baanNummers.get(1).getBaanNummer())); builder.setView(v) // Add action buttons .setPositiveButton(R.string.dialog_ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { int baan1 = Integer.valueOf(editText1.getText().toString()); int baan2 = Integer.valueOf(editText2.getText().toString()); InitSpel.setBaanNummer(0, baan1); InitSpel.setBaanNummer(1, baan2); // en banen nog bij de preferences op schijf opslaan... // We need an Editor object (prefs.edit()) to make preference changes. // All objects are from android.context.Context prefs.edit().putInt("BAAN_01", baan1); prefs.edit().putInt("BAAN_02", baan2); // Commit the edits! prefs.edit().commit(); } }) .setNegativeButton(R.string.dialog_cancel, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { // TODO cancel; } }); return builder.create(); } } ```

Original source