Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to read/write preferences from a DialogFragment?

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();
    }   
 }
like image 584
user1837293 Avatar asked Jan 26 '13 17:01

user1837293


People also ask

How do you show DialogFragment?

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.

Is DialogFragment deprecated?

This method is deprecated. androidx. activity.

What is the difference between dialog & DialogFragment?

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.


1 Answers

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();
like image 66
A--C Avatar answered Oct 06 '22 19:10

A--C