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();
}
}
Showing the DialogFragment It is not necessary to manually create a FragmentTransaction to display your DialogFragment . Instead, use the show() method to display your dialog. You can pass a reference to a FragmentManager and a String to use as a FragmentTransaction tag.
This method is deprecated. androidx. activity.
Dialog: A dialog is a small window that prompts the user to make a decision or enter additional information. DialogFragment: A DialogFragment is a special fragment subclass that is designed for creating and hosting dialogs.
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();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With