Android SharedPreferences dans le fragment


90

J'essaye de lire SharedPreferences dans Fragment. Mon code est ce que j'utilise pour obtenir des préférences dans toute autre activité.

     SharedPreferences preferences = getSharedPreferences("pref", 0);

Je reçois une erreur

    Cannot make a static reference to the non-static method getSharedPreferences(String, int) from the type ContextWrapper    

J'ai essayé de suivre ces liens mais sans chance d' accéder à SharedPreferences via des méthodes statiques et Static SharedPreferences . Merci pour toute solution.

Réponses:


254

La méthode getSharedPreferencesest une méthode de l' Contextobjet, donc appeler simplement getSharedPreferences à partir d'un Fragmentne fonctionnera pas ... car ce n'est pas un contexte! (Activity est une extension de Context, nous pouvons donc appeler getSharedPreferences à partir de celui-ci).

Vous devez donc obtenir le contexte de vos applications par

// this = your fragment
SharedPreferences preferences = this.getActivity().getSharedPreferences("pref", Context.MODE_PRIVATE);

1
getSharedPreferences ("pref", 0); zéro (0) signifie que privé / public?
Kailas

@Kailas correct, le mode, c'est-à-dire WORLD_READABLE ect. developer.android.com/reference/android/content/… , int)
Jug6ernaut

5
0 est analogue à MODE_PRIVATE (ou Context.MODE_PRIVATE s'il est utilisé dans une classe qui n'est pas une extension de Context, telle qu'un Fragment). Cela signifie que seule l'application en question peut accéder aux préférences. Vous ne devez pas utiliser WORLD_READABLE ou WORLD_WRITEABLE car ils sont obsolètes dans l'API 17+, sans parler d'une menace de sécurité.
Ankit Aggarwal

1
ce thismot clé est-il nécessaire lors de l'exécution this.getActivity().getShared..?
Subby

2
@Subby non, appeler explicitement "ceci" n'est jamais nécessaire. Je l'ai fait par préférence personnelle car je déteste les appels de méthode ambigus. Le seul moment où "ceci" est requis est lorsque vous essayez d'accéder à un objet non statique parent lorsque vous êtes hors de sa portée en étant dans une classe / interface interne anonyme.
Jug6ernaut

14

La réponse marquée n'a pas fonctionné pour moi, j'ai dû utiliser

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());

ÉDITER:

Ou essayez simplement de supprimer this:

SharedPreferences prefs = getActivity().getSharedPreferences("pref", Context.MODE_PRIVATE);

8
La réponse marquée n'a pas fonctionné pour vous car vous accédez aux préférences partagées par défaut. Une meilleure conception consiste à stocker vos préférences non pas en tant qu'objet partagé mais dans un espace séparé et privé, ce qui est l'objet de la question et de la réponse ici.
zeeshan

8

En guise de mise en garde, cette réponse fournie par l'utilisateur ci-dessus est correcte.

SharedPreferences preferences = this.getActivity().getSharedPreferences("pref",0);

Cependant, si vous essayez d'obtenir quelque chose dans le fragment avant que onAttach ne soit appelé, getActivity () renverra null.


3

Vous pouvez créer la méthode SharedPrefencesin onAttachdu fragment comme ceci:

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    SharedPreferences preferences = context.getSharedPreferences("pref", 0);
}


1

getActivity()et ne onAttach()m'a pas aidé dans la même situation
peut-être que j'ai fait quelque chose de mal
mais! J'ai trouvé une autre décision,
j'ai créé un champ Context thisContextdans mon fragment
et j'ai obtenu un contexte actuel de la méthode onCreateView
et maintenant je peux travailler avec la préférence partagée à partir du fragment

public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {   
...   
thisContext = container.getContext();   
...   
}

1

Pour définir la préférence dans Fragment: SharedPreferences pref = getActivity().getSharedPreferences("CargaDatosCR",Context.MODE_PRIVATE); editor.putString("credi_credito",cre); editor.commit();

Pour appeler une autre activité ou fragmenter les données de préférence: SharedPreferences pref = getActivity().getSharedPreferences("CargaDatosCR", Context.MODE_PRIVATE); credit=pref.getString("credi_credito",""); if(credit.isNotEmpty)...


0

Il est possible d'obtenir un contexte à partir d'un Fragment

Fais juste

public class YourFragment extends Fragment {

    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
        final View root = inflater.inflate(R.layout.yout_fragment_layout, container, false);
        // get context here
        Context context = getContext();
        // do as you please with the context


        // if you decide to go with second option
        SomeViewModel someViewModel = ViewModelProviders.of(this).get(SomeViewModel.class);
        Context context = homeViewModel.getContext();
        // do as you please with the context
        return root;
    }
}

Vous pouvez également joindre un AndroidViewModeldans la onCreateViewméthode qui implémente une méthode qui renvoie le contexte de l'application

public class SomeViewModel extends AndroidViewModel {

    private MutableLiveData<ArrayList<String>> someMutableData;
    Context context;

    public SomeViewModel(Application application) {
        super(application);
        context = getApplication().getApplicationContext();
        someMutableData = new MutableLiveData<>();
        .
        .
     }

     public Context getContext() {
         return context
     }
  }

0

Peut-être que cela peut aider quelqu'un après quelques années. Une nouvelle façon, sur Androidx, d'accéder SharedPreferences()à un fragment est de l'implémenter dansgradle dependencies

implementation "androidx.preference:preference:1.1.1"

puis, à l'intérieur de l'appel de fragment

SharedPreferences preferences;
preferences = androidx.preference.PreferenceManager.getDefaultSharedPreferences(getActivity());

0

utiliser l'activité requise dans le fragment kotlin

 val sharedPreferences = requireActivity().getSharedPreferences(loginmasuk.LOGIN_DATA, Context.MODE_PRIVATE)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.