我想从DialogFragment中的首选项文件中读取。如果我这样做:
prefs = getSharedPreferences("numberPicker.preferences", 0);
然后我得到一个编译时错误,因为getSharedReference是一个ContextWrapper方法但是DialogFragment不是ContextWrapper(我使用android.support.v4.app.DialogFragment来向后兼容)。
如果是替代方案,作为“解决方法”,我使用在类InitSpel中创建的SharedPreferences对象prefs(它是一个FragmentActivity,因此是一个ContextWrapper)然后我没有得到任何错误(也没有在编译时也没有在运行时)但是值不会被存储(下次启动应用程序时,值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();
}
}
答案 0 :(得分:8)
使用getActivity()
,因为Activity
延伸Context
,Context
有getSharedPreferences()
方法。
prefs = getActivity().getSharedPreferences("numberPicker.preferences", 0);
我还建议保留对Editor对象的引用,以确保正确保存。
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();