টুকরাটিতে অ্যান্ড্রয়েড অংশীদারি


90

আমি ভাগের মধ্যে ভাগ করা পছন্দগুলি পড়ার চেষ্টা করছি। আমার কোডটি হ'ল আমি অন্য কোনও ক্রিয়াকলাপে পছন্দগুলি পেতে ব্যবহার করি।

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

আমি ত্রুটি পাই

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

আমি এই লিঙ্কগুলি অনুসরণ করার চেষ্টা করেছি তবে ভাগ্য ছাড়াই স্থিতিশীল পদ্ধতি এবং স্ট্যাটিক শেয়ারডপ্রিফারেন্সের মাধ্যমে ভাগ করে নেওয়া পছন্দগুলি ব্যবহার করে । কোন সমাধানের জন্য আপনাকে ধন্যবাদ।

উত্তর:


254

পদ্ধতিটি অবজেক্টের getSharedPreferencesএকটি পদ্ধতি Context, সুতরাং কেবলমাত্র থেকে getSharedPreferences কল করা কার্যকর Fragmentহবে না ... কারণ এটি প্রসঙ্গ নয়! (ক্রিয়াকলাপ প্রসঙ্গে একটি এক্সটেনশান, সুতরাং আমরা এগুলি থেকে getSharedPreferences কল করতে পারি)।

সুতরাং আপনার অ্যাপ্লিকেশনগুলি প্রসঙ্গটি পেতে হবে

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

4
getSharedPreferences ("প্রিফ", 0); শূন্য (0) এর অর্থ বেসরকারী / সরকারী কী?
কৈলাস 22:25

@ কৈলাস সঠিক, মোড, যেমন WORLD_READABLE ect। বিকাশকারী.অ্যান্ড্রয়েড
রেফারেন্স

4
0 হ'ল MODE_PRIVATE (বা প্রসঙ্গ। MODE_PRIVATE হিসাবে কোনও শ্রেণীর মধ্যে ব্যবহার করা হয় যা প্রসঙ্গের এক্সটেনশন নয়, যেমন একটি খণ্ড) to এর অর্থ হল যে প্রশ্নে থাকা অ্যাপটিই পছন্দগুলিতে অ্যাক্সেস করতে পারে। সুরক্ষা হুমকির কথা উল্লেখ না করে আপনি WORLD_READABLE বা WORLD_WRITEABLE ব্যবহার করবেন না কারণ এপিআই 17+ এ তারা অবনমিত রয়েছে।
অঙ্কিত আগরওয়াল

4
এই thisকীওয়ার্ডটি করার সময় কি প্রয়োজনীয় this.getActivity().getShared..?
সাববি

4
@ সাব্বি নো, স্পষ্টভাবে কেবল "এটি" কল করা কখনই প্রয়োজন হয় না। আমি অস্পষ্ট পদ্ধতিতে কলগুলি ঘৃণা করার কারণে এটি ব্যক্তিগত পছন্দ ছাড়াই করেছি। আপনি যখন কোনও বেনামি অভ্যন্তর শ্রেণি / ইন্টারফেসে থাকার সুযোগ থেকে বাইরে চলে যান তখন আপনি যখন কোনও পিতামহীন অ স্থির অবজেক্ট অ্যাক্সেস করার চেষ্টা করছেন তখন কেবলমাত্র "এই" প্রয়োজন হয়।
Jug6ernaut

14

চিহ্নিত উত্তরটি আমার পক্ষে কার্যকর হয়নি, আমাকে ব্যবহার করতে হয়েছিল

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

সম্পাদনা:

অথবা কেবল এটিকে অপসারণ করার চেষ্টা করুন this:

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

8
চিহ্নিত উত্তরটি আপনার পক্ষে কার্যকর হয়নি কারণ আপনি ডিফল্ট ভাগ করা পছন্দগুলি অ্যাক্সেস করছেন। একটি ভাল নকশা হ'ল আপনার পছন্দগুলি একটি ভাগ করা অবজেক্ট হিসাবে নয় বরং একটি পৃথক এবং প্রাইভেট স্পেসে সংরক্ষণ করা, যা এখানে প্রশ্নোত্তর।
জিশান

8

সাবধানতার নোট হিসাবে আমার উপরের ব্যবহারকারী দ্বারা সরবরাহ করা এই উত্তরটি সঠিক।

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

যাইহোক, যদি অন্টাচকে getActivity () বলা হয় তার আগে আপনি খণ্ডে কিছু পাওয়ার চেষ্টা করেন তবে তা বাতিল হয়ে যাবে।


3

আপনি করতে পারেন SharedPrefencesমধ্যে onAttachএই রকম টুকরা এর পদ্ধতি:

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


1

getActivity()এবং onAttach()একই পরিস্থিতিতে আমাকে সহায়তা
করেনি সম্ভবত আমি কিছু ভুল করেছি
কিন্তু! আমি আমার সিদ্ধান্তের অভ্যন্তরে
একটি ক্ষেত্র তৈরি Context thisContextকরেছি
এবং অনক্রিটভিউ পদ্ধতিতে একটি বর্তমান প্রসঙ্গ পেয়েছি
এবং এখন আমি খণ্ডগুলি থেকে ভাগ করা প্রিফের সাথে কাজ করতে পারি

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

1

খণ্ডে পছন্দটি নির্ধারণ করতে: 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

সম্ভবত এটি কয়েক বছর পরে কারও কাছে সহায়ক। অ্যান্ড্রয়েডএক্সে নতুন উপায় হ'ল SharedPreferences()টুকরো টুকরো টুকরোটি implementgradle dependencies

implementation "androidx.preference:preference:1.1.1"

এবং তারপরে, খণ্ড কলের ভিতরে

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

0

টুকরা কোটলিনে প্রয়োজনীয় সক্রিয়তা ব্যবহার করুন

 val sharedPreferences = requireActivity().getSharedPreferences(loginmasuk.LOGIN_DATA, Context.MODE_PRIVATE)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.