如何从DialogFragment读取/写入首选项?

我想从DialogFragment中的首选项文件读取。 如果我这样做:

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

那么我得到一个编译时错误,因为getSharedReference是一个ContextWrapper方法,但DialogFragment不是一个ContextWrapper(我使用android.support.v4.app.DialogFragment向后兼容的方式)。

如果可选地,作为一种“解决方法”,我使用在类InitSpel(这是一个FragmentActivity,因此是一个ContextWrapper)中创build的SharedPreferences对象prefs,然后我得到没有错误(在编译时,也没有在运行时),但值不存储(下次我启动应用程序的值baan1和baan2仍然是0)。

怎么解决?

 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(); } } 

Solutions Collecting From Web of "如何从DialogFragment读取/写入首选项?"

由于Activity扩展了Context ,所以使用getActivity() ,并且Context有一个getSharedPreferences()方法。

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

我还build议保留对编辑器对象的引用,以确保正确保存。

 SharedPreferences.Editor editor = prefs.edit(); editor.putInt("BAAN_01", baan1); editor.putInt("BAAN_02", baan2); // Commit the edits! editor.commit(); 

或链条:

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