Android SharedPreferences in Fragment

87

Ich versuche, SharedPreferences in Fragment zu lesen. Mein Code wird verwendet, um Einstellungen für andere Aktivitäten abzurufen.

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

Ich bekomme einen Fehler

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

Ich habe versucht, diesen Links zu folgen, aber ohne Erfolg Zugriff auf SharedPreferences über statische Methoden und statische SharedPreferences . Vielen Dank für jede Lösung.

Kennzeichen
quelle

Antworten:

249

Die Methode getSharedPreferencesist eine Methode des ContextObjekts, daher funktioniert Fragmentes nicht , nur getSharedPreferences von a aufzurufen ... da es sich nicht um einen Kontext handelt! (Aktivität ist eine Erweiterung von Context, sodass wir getSharedPreferences von dort aus aufrufen können.)

Sie müssen also Ihren Anwendungskontext von erhalten

// this = your fragment
SharedPreferences preferences = this.getActivity().getSharedPreferences("pref", Context.MODE_PRIVATE);
Jug6ernaut
quelle
1
getSharedPreferences ("pref", 0); Null (0) bedeutet was privat / öffentlich?
Kailas
@Kailas korrekt, der Modus, dh WORLD_READABLE ect. developer.android.com/reference/android/content/… , int)
Jug6ernaut
5
0 ist analog zu MODE_PRIVATE (oder Context.MODE_PRIVATE, wenn es in einer Klasse verwendet wird, die keine Erweiterung von Context ist, z. B. ein Fragment). Dies bedeutet, dass nur die betreffende App auf die Einstellungen zugreifen kann. Sie sollten WORLD_READABLE oder WORLD_WRITEABLE nicht verwenden, da diese in API 17+ veraltet sind, ganz zu schweigen von einer Sicherheitsbedrohung.
Ankit Aggarwal
1
Ist dieses thisSchlüsselwort dabei erforderlich this.getActivity().getShared..?
Subby
2
@Subby nein, explizit nur "dies" zu nennen ist nie notwendig. Ich habe es aus persönlichen Gründen gemacht, weil ich mehrdeutige Methodenaufrufe hasse. "Dies" ist nur erforderlich, wenn Sie versuchen, auf ein übergeordnetes nicht statisches Objekt zuzugreifen, wenn Sie sich außerhalb des Gültigkeitsbereichs einer anonymen inneren Klasse / Schnittstelle befinden.
Jug6ernaut
13

Die markierte Antwort hat bei mir nicht funktioniert, ich musste verwenden

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

BEARBEITEN:

Oder versuchen Sie einfach, Folgendes zu entfernen this:

SharedPreferences prefs = getActivity().getSharedPreferences("pref", Context.MODE_PRIVATE);
Leon
quelle
7
Die markierte Antwort hat bei Ihnen nicht funktioniert, da Sie auf freigegebene Standardeinstellungen zugreifen. Ein besseres Design besteht darin, Ihre Einstellungen nicht als gemeinsames Objekt, sondern in einem separaten und privaten Bereich zu speichern. Darum geht es bei der Frage und Antwort hier.
Zeeshan
8

Aus Vorsicht ist diese Antwort des Benutzers über mir korrekt.

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

Wenn Sie jedoch versuchen, etwas in dem Fragment abzurufen, bevor onAttach getActivity () heißt, wird null zurückgegeben.

ed209
quelle
3

Sie können die SharedPrefencesIn- onAttachMethode des Fragments wie folgt erstellen:

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

getActivity()und onAttach()hat mir in der gleichen Situation nicht geholfen,
vielleicht habe ich etwas falsch gemacht,
aber! Ich habe eine andere Entscheidung gefunden.
Ich habe ein Feld Context thisContextin meinem Fragment erstellt
und einen aktuellen Kontext von der Methode onCreateView erhalten.
Jetzt kann ich mit gemeinsam genutzten Einstellungen aus dem Fragment arbeiten

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

So definieren Sie die Einstellung in Fragment: SharedPreferences pref = getActivity().getSharedPreferences("CargaDatosCR",Context.MODE_PRIVATE); editor.putString("credi_credito",cre); editor.commit();

So rufen Sie eine andere Aktivität auf oder fragmentieren die Präferenzdaten: SharedPreferences pref = getActivity().getSharedPreferences("CargaDatosCR", Context.MODE_PRIVATE); credit=pref.getString("credi_credito",""); if(credit.isNotEmpty)...

user11809346
quelle
0

Es ist möglich, einen Kontext aus a heraus zu erhalten Fragment

Mach einfach

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

Sie können auch eine angebaute AndroidViewModelin dem onCreateViewVerfahren , dass Geräte eine Methode , die den Anwendungskontext zurückgibt

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
     }
  }
Davejoem
quelle