फ्रैगमेंट में Android SharedPreferences


90

मैं फ्रागमेंट के अंदर शेयर्डप्रीफर्स पढ़ने की कोशिश कर रहा हूं। मेरा कोड वह है जो मैं किसी अन्य गतिविधि में वरीयताओं को प्राप्त करने के लिए उपयोग करता हूं।

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

मुझे त्रुटि मिलती है

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

मैंने इन लिंक्स का पालन करने की कोशिश की है, लेकिन स्थैतिक तरीकों और स्टेटिक शेयर्डप्रिफरेंस के माध्यम से साझा करने के लिए कोई भाग्य नहीं है । किसी भी समाधान के लिए धन्यवाद।

जवाबों:


253

विधि वस्तु getSharedPreferencesका एक तरीका है Context, इसलिए केवल a से getSedenPreferences को कॉल करनाFragment काम नहीं चलेगा ... क्योंकि यह एक संदर्भ नहीं है! (गतिविधि प्रसंग का एक विस्तार है, इसलिए हम इसे से गेटशेडप्रदर्शन कह सकते हैं)।

तो आपको अपने आवेदन Context द्वारा प्राप्त करने होंगे

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

1
getSharedPreferences ( "वरी", 0); शून्य (0) का मतलब क्या निजी / सार्वजनिक है?
कैलास

@ कैलास सही, मोड, यानी WORLD_READABLE ect। डेवलपर
.android.com

5
0 MODE_PRIVATE (या Context.MODE_PRIVATE) के अनुरूप है यदि एक वर्ग के भीतर उपयोग किया जाता है जो प्रसंग का विस्तार नहीं है, जैसे कि एक टुकड़ा)। इसका मतलब है कि प्रश्न में केवल ऐप वरीयताओं तक पहुंच सकता है। जब आप API 17+ में पदावनत नहीं होते हैं, तो आप सुरक्षा का उल्लेख नहीं करने के लिए World_READABLE या WORLD_WRITEABLE का उपयोग नहीं करना चाहिए।
अंकित अग्रवाल

1
क्या यह thisकीवर्ड आवश्यक है this.getActivity().getShared..?
सुबेई

2
@ सोबी नहीं, स्पष्ट रूप से केवल "यह" कॉल करना आवश्यक नहीं है। मैं व्यक्तिगत पसंद से बाहर किया था क्योंकि मैं अस्पष्ट विधि कॉल से नफरत करता हूं। एकमात्र समय "यह" आवश्यक है, जब आप किसी अनाम आंतरिक वर्ग / इंटरफ़ेस में होने के दायरे से बाहर होने पर किसी मूल गैर-स्थिर ऑब्जेक्ट तक पहुँचने का प्रयास कर रहे हों।
जुगेरनोट

13

चिह्नित उत्तर मेरे काम नहीं आया, मुझे इसका उपयोग करना था

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

संपादित करें:

या केवल हटाने का प्रयास करें this:

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

8
चिह्नित उत्तर आपके लिए काम नहीं करता क्योंकि आप डिफ़ॉल्ट साझा प्राथमिकताओं तक पहुंच बना रहे हैं। एक बेहतर डिजाइन अपनी वरीयताओं को एक साझा वस्तु के रूप में नहीं, बल्कि एक अलग और निजी स्थान पर संग्रहीत करना है, जो कि यहां सवाल और जवाब है।
जीशान

8

सावधानी के एक नोट के रूप में मेरे ऊपर के उपयोगकर्ता द्वारा प्रदान किया गया यह उत्तर सही है।

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

हालाँकि, यदि आप onAttach को getActivity () कहते हैं तो इससे पहले कि आप कुछ भी प्राप्त करने का प्रयास करते हैं, अशक्त हो जाएगा।


3

आप कर सकते हैं SharedPrefencesमें onAttachइस तरह टुकड़ा की विधि:

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


1

getActivity()और onAttach()एक ही स्थिति में मेरी मदद नहीं की
शायद मैंने कुछ गलत किया है
लेकिन! मुझे एक और निर्णय मिला
कि मैंने Context thisContextअपने फ्रैगमेंट के अंदर एक क्षेत्र बनाया है
और विधि onCreateView से एक वर्तमान संदर्भ प्राप्त किया है
और अब मैं टुकड़े से साझा प्रीफ़ के साथ काम कर सकता हूं

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

1

Fragment में वरीयता को परिभाषित करने के लिए: SharedPreferences pref = getActivity().getSharedPreferences("CargaDatosCR",Context.MODE_PRIVATE); editor.putString("credi_credito",cre); editor.commit();

किसी अन्य गतिविधि को कॉल करने या वरीयता डेटा को खंडित करने के लिए: SharedPreferences pref = getActivity().getSharedPreferences("CargaDatosCR", Context.MODE_PRIVATE); credit=pref.getString("credi_credito",""); if(credit.isNotEmpty)...


0

एक के भीतर से एक संदर्भ प्राप्त करना संभव है Fragment

बस करो

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

आप AndroidViewModelउस onCreateViewविधि में भी संलग्न कर सकते हैं जो एक विधि लागू करता है जो अनुप्रयोग संदर्भ देता है

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

हो सकता है कि यह कुछ वर्षों के बाद किसी के लिए सहायक हो। नया तरीका, Androidx पर, SharedPreferences()खंड के अंदर होने का कार्यान्वयन करना हैgradle dependencies

implementation "androidx.preference:preference:1.1.1"

और फिर, टुकड़ा कॉल के अंदर

SharedPreferences preferences;
preferences = androidx.preference.PreferenceManager.getDefaultSharedPreferences(getActivity());
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.