Fragment İçinde Android Paylaşılan Tercihler


90

Fragment içindeki SharedPreferences'ı okumaya çalışıyorum. Kodum, diğer herhangi bir Faaliyette tercihleri ​​almak için kullandığım şeydir.

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

Hata alıyorum

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

Bu bağlantıları izlemeye çalıştım ama hiç şansım olmadı. Paylaşılan Tercihlere statik yöntemler ve Statik Paylaşılan Tercihler yoluyla Erişme . Herhangi bir çözüm için teşekkür ederim.

Yanıtlar:


256

Yöntem getSharedPreferences, Contextnesnenin bir yöntemidir , bu nedenle, yalnızca getSharedPreferences öğesini a'dan çağırmak Fragmentişe yaramaz ... çünkü bu bir Bağlam değildir! (Etkinlik, Bağlamın bir uzantısıdır, bu nedenle ondan getSharedPreferences çağrabiliriz).

Bu nedenle uygulamalarınızın Bağlamını şu şekilde almanız gerekir:

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

1
getSharedPreferences ("pref", 0); sıfır (0) ne özel / genel anlamındadır?
Kailas

@Kailas doğru, mod, yani WORLD_READABLE vb. developer.android.com/reference/android/content/… , int)
Jug6ernaut

5
0, MODE_PRIVATE (veya bir Fragment gibi Bağlamın uzantısı olmayan bir sınıf içinde kullanılıyorsa Context.MODE_PRIVATE) ile benzerdir. Bu, tercihlere yalnızca söz konusu uygulamanın erişebileceği anlamına gelir. Bir güvenlik tehdidinden bahsetmeden, API 17 + 'da kullanımdan kaldırıldıkları için WORLD_READABLE veya WORLD_WRITEABLE'ı kullanmamalısınız.
Ankit Aggarwal

1
bu thisanahtar kelime yaparken gerekli this.getActivity().getShared..mi?
2014

2
@Subby hayır, açıkça "bu" demek asla gerekli değildir. Belirsiz yöntem çağrılarından nefret ettiğim için kişisel tercihlerimden yaptım. "This" in gerekli olduğu tek zaman, anonim bir iç sınıf / arabirimde olmanın kapsamı dışında olduğunuzda statik olmayan bir üst nesneye erişmeye çalıştığınız zamandır.
Jug6ernaut

14

İşaretli cevap benim için işe yaramadı, kullanmak zorunda kaldım

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

DÜZENLE:

Veya thisşunları kaldırmayı deneyin :

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

8
Varsayılan paylaşılan tercihlere eriştiğiniz için işaretli yanıt sizin için işe yaramadı. Daha iyi bir tasarım, tercihlerinizi paylaşılan bir nesne olarak değil, ayrı ve özel bir alanda saklamaktır, buradaki soru ve cevap da budur.
zeeshan

8

Bir uyarı olarak, üstümdeki kullanıcı tarafından verilen bu cevap doğrudur.

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

Ancak, onAttach çağrılmadan önce parçada herhangi bir şey almaya çalışırsanız getActivity () null döndürür.


3

Sen yapabilir SharedPrefencesiçinde onAttachböyle parçasının yöntemi:

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


1

getActivity()ve onAttach()bana aynı durumda yardımcı
olmadı belki yanlış bir şey yaptım
ama! Başka bir karar buldum Parçam içinde
bir alan oluşturdum ve onCreateView yönteminden güncel bir bağlam aldım ve şimdi parçadan paylaşılan pref ile çalışabilirim Context thisContext

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

1

Parçada tercihi tanımlamak için: SharedPreferences pref = getActivity().getSharedPreferences("CargaDatosCR",Context.MODE_PRIVATE); editor.putString("credi_credito",cre); editor.commit();

Başka bir faaliyeti veya kısmı tercih verilerini çağırmak için: SharedPreferences pref = getActivity().getSharedPreferences("CargaDatosCR", Context.MODE_PRIVATE); credit=pref.getString("credi_credito",""); if(credit.isNotEmpty)...


0

Bir içeriğin içinden bir bağlam elde etmek mümkündür. Fragment

Sadece yap

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

Ayrıca, bağlı olabilir AndroidViewModelolarak onCreateViewyöntem bu uygular uygulama bağlamında döndüren bir yöntem

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

Belki bu, birkaç yıl sonra birine yardımcı olur. Androidx'te SharedPreferences()parçanın içine girmenin yeni yolu,gradle dependencies

implementation "androidx.preference:preference:1.1.1"

ve sonra, parça çağrısının içinden

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

0

kotlin parçasında gerekli etkinliği kullanın

 val sharedPreferences = requireActivity().getSharedPreferences(loginmasuk.LOGIN_DATA, Context.MODE_PRIVATE)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.