Android SharedPreferences di Fragmen

90

Saya mencoba membaca SharedPreferences di dalam Fragment. Kode saya adalah apa yang saya gunakan untuk mendapatkan preferensi dalam Aktivitas lainnya.

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

Saya mendapatkan kesalahan

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

Saya telah mencoba mengikuti tautan ini tetapi tidak berhasil Mengakses SharedPreferences melalui metode statis dan Static SharedPreferences . Terima kasih atas solusinya.

Menandai
sumber

Jawaban:

254

Metode getSharedPreferencesini adalah metode Contextobjek, jadi memanggil getSharedPreferences dari a Fragmenttidak akan berfungsi ... karena ini bukan Konteks! (Aktivitas adalah perpanjangan dari Konteks, jadi kita bisa memanggil getSharedPreferences darinya).

Jadi, Anda harus mendapatkan Context aplikasi Anda dengan

// this = your fragment
SharedPreferences preferences = this.getActivity().getSharedPreferences("pref", Context.MODE_PRIVATE);
Jug6ernaut
sumber
1
getSharedPreferences ("pref", 0); nol (0) artinya apa yang privat / publik?
Kailas
@ Kailas benar, modenya, yaitu WORLD_READABLE dll. developer.android.com/reference/android/content/… , int)
Jug6ernaut
5
0 analog dengan MODE_PRIVATE (atau Context.MODE_PRIVATE jika digunakan dalam kelas yang bukan merupakan ekstensi Konteks, seperti Fragmen). Artinya, hanya aplikasi yang dimaksud yang dapat mengakses preferensi. Anda tidak boleh menggunakan WORLD_READABLE atau WORLD_WRITEABLE karena sudah tidak digunakan lagi di API 17+, belum lagi ancaman keamanan.
Ankit Aggarwal
1
apakah thiskata kunci ini diperlukan saat melakukan this.getActivity().getShared..?
Subby
2
@ Subby no, secara eksplisit menyebut "ini" tidak pernah diperlukan. Saya melakukannya karena preferensi pribadi karena saya benci panggilan metode yang ambigu. Satu-satunya waktu "ini" diperlukan adalah ketika Anda mencoba mengakses objek non-statis induk saat Anda berada di luar ruang lingkupnya karena berada di kelas / antarmuka dalam anonim.
Jug6ernaut
14

Jawaban yang ditandai tidak berhasil untuk saya, saya harus menggunakan

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

EDIT:

Atau coba hapus this:

SharedPreferences prefs = getActivity().getSharedPreferences("pref", Context.MODE_PRIVATE);
Leon
sumber
8
Jawaban yang ditandai tidak berhasil untuk Anda karena Anda mengakses preferensi bersama default. Desain yang lebih baik adalah menyimpan preferensi Anda bukan sebagai objek bersama tetapi di ruang terpisah dan pribadi, yang menjadi pertanyaan dan jawabannya di sini.
zeeshan
8

Sebagai catatan hati-hati, jawaban yang diberikan oleh pengguna di atas saya benar.

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

Namun, jika Anda mencoba mendapatkan apa pun dalam fragmen sebelum onAttach dipanggil getActivity () akan mengembalikan null.

ed209
sumber
3

Anda dapat membuat metode SharedPrefencesin onAttachfragment seperti ini:

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

getActivity()dan onAttach()tidak membantu saya dalam situasi yang sama
mungkin saya melakukan sesuatu yang salah
tapi! Saya menemukan keputusan lain
Saya telah membuat bidang Context thisContextdi dalam Fragmen saya
Dan mendapat konteks saat ini dari metode onCreateView
dan sekarang saya dapat bekerja dengan pref bersama dari fragmen

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

Untuk menentukan preferensi di Fragmen: SharedPreferences pref = getActivity().getSharedPreferences("CargaDatosCR",Context.MODE_PRIVATE); editor.putString("credi_credito",cre); editor.commit();

Untuk memanggil aktivitas lain atau memecah data preferensi: SharedPreferences pref = getActivity().getSharedPreferences("CargaDatosCR", Context.MODE_PRIVATE); credit=pref.getString("credi_credito",""); if(credit.isNotEmpty)...

pengguna11809346
sumber
0

Dimungkinkan untuk mendapatkan konteks dari dalam a Fragment

Lakukan saja

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

Anda juga dapat melampirkan AndroidViewModeldalam onCreateViewmetode yang mengimplementasikan metode yang mengembalikan konteks aplikasi

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
sumber
0

Mungkin ini bermanfaat bagi seseorang setelah beberapa tahun. Cara baru, di Androidx, untuk masuk ke SharedPreferences()dalam fragmen adalah dengan menerapkan kegradle dependencies

implementation "androidx.preference:preference:1.1.1"

dan kemudian, di dalam panggilan fragmen

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

gunakan aktivitas yang diperlukan dalam fragmen kotlin

 val sharedPreferences = requireActivity().getSharedPreferences(loginmasuk.LOGIN_DATA, Context.MODE_PRIVATE)
reza rahmad
sumber