অ্যান্ড্রয়েড পছন্দসমূহ: ব্যবহারকারী যখন পছন্দগুলি-স্ক্রীন ব্যবহার না করে তখন ডিফল্ট মানগুলি কীভাবে লোড করা যায়?


119

ব্যবহারকারীকে কিছু মান সেট করতে দিতে আমি একটি পছন্দেরঅ্যাক্টিভিটি ব্যবহার করছি। আমি এটি নির্ধারিত পছন্দগুলি সহ এক্সএমএল ফাইলটি খাচ্ছি।

আমি android:defaultValue=""তাদের জন্য সমস্ত সেট করে রেখেছি ।

আমি যখন আমার অ্যাপ্লিকেশন শুরু করব তখন আমার পছন্দগুলি প্রয়োজন, বা সেগুলি এখনও ম্যানুয়ালি সেট না করা থাকলে আমি ডিফল্ট মানগুলি চাই:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
boolean value = prefs.getBoolean("key"), false); 

যাইহোক, android:defaultValue="true"আমি এখনও পেতে false। সুতরাং, দেখে মনে হচ্ছে এক্সএমএলে সেট করা ডিফল্টভ্যালুগুলি অন্য কোথাও ব্যবহৃত হয় না তবে পছন্দগুলি-স্ক্রিন শুরু করার সময়।

আমি getBoolean()পদ্ধতিতে ডিফল্ট মানগুলি হার্ডকোড করতে চাই না । সুতরাং, কেবলমাত্র 1 জায়গায় এইগুলি সংজ্ঞায়িত করার সাথে ডিফল্ট-মানগুলি পাওয়ার কোনও উপায় আছে?

উত্তর:


169

এই প্রশ্নটি আমার মতো:

আরম্ভ-অভিরুচি-থেকে-XML-ইন-প্রধান-কার্যকলাপ

onCreateপদ্ধতিতে কেবল এই কোডটি ব্যবহার করুন :

PreferenceManager.setDefaultValues(this, R.xml.preference, false);

এটি XML থেকে আপনার পছন্দগুলি লোড করবে এবং শেষ প্যারামিটারটি ( readAgain) গ্যারান্টি দেয় যে ব্যবহারকারীর পছন্দগুলি ওভাররাইট করা হবে না। এর অর্থ দাঁড় readAgainকরিয়ে দেওয়ার falseঅর্থ দাঁড় করিয়ে দেওয়া মানে এটি কেবলমাত্র ডিফল্ট মানগুলি সেট করবে যদি এই পদ্ধতিটি আগে কখনও কল করা হয়নি তবে আপনার কার্যকলাপটি তৈরি হওয়ার সময় প্রত্যেকবার ব্যবহারকারীর সেটিংসকে ওভাররাইড করার বিষয়ে আপনার চিন্তা করার দরকার নেই you

আরও তদন্তের জন্য অ্যানড্রইড এপিআই-এ পছন্দসই ম্যানেজ.আরসেটডফোল্টভ্যালুগুলি দেখুন ।


আমরা এটি তৈরি করে যা অন্য কোনও SharedPrefrence পরিবর্তনশীল উপর ব্যবহার করতে পারি?
অমল গুপ্ত

8
এছাড়াও, আপনার অ্যাপ মাল্টিপল এন্ট্রি পয়েন্ট থাকে, তবে তাতে স্থান onCreate()এর Application
এসডি

2
যদি কোনও বুলিয়ান ব্যবহার করে এবং "মিথ্যা" হিসাবে ডিফল্ট হয় তবে অ্যান্ড্রয়েড ২.x এ ডিফল্ট এন্ট্রি তৈরি হবে না তবে এটি কাজ করে না does ".GetBoolean (KEY, true)" এর কলটি সর্বদা সত্য ফিরে আসবে। Android 4.x এর জন্য এটি কাজ করে।
গুনার বার্নস্টেইন

10
readAgainসত্যে সেট করা ব্যবহারকারীর পছন্দগুলিকে ওভাররাইট করা হওয়ার সাথে কিছুই করার নেই। জাভাডোক থেকে: দ্রষ্টব্য: এটি পছন্দগুলি তাদের ডিফল্ট মানগুলিতে পুনরায় সেট করবে না।
ডেভনসোল

1
এই সমাধানটিতে যাদের সমস্যা রয়েছে (এটি কাজ করে না বা আংশিকভাবে কাজ করে বা সবসময় কাজ করে না) নীচে স্টিভ ওয়ারিংয়ের উত্তর দেখুন ( stackoverflow.com/a/25602205/4410376 )। সম্ভবত আপনার বেশ কয়েকটি শেয়ারড-প্রিফ ফাইল রয়েছে, যেমন অ্যান্ড্রয়েড আপনার কনফিগারেশন বা অগোছালো কোডের ভিত্তিতে বেশ কয়েকটি শেয়ারড-প্রেফ ফাইল তৈরি করছে।
হ্যাক06

27

আপনি যদি ব্যবহার করে থাকেন তবে সচেতন হন
getSharedPreferences(String sharedPreferencesName, int sharedPreferencesMode)

পছন্দগুলি পুনরুদ্ধার করতে আপনাকে ডিফল্ট সেট করতে ব্যবহার করতে হবে!
PreferenceManager.setDefaultValues(Context context, String sharedPreferencesName, int sharedPreferencesMode, int resId, boolean readAgain)

উদাহরণ স্বরূপ:
PreferenceManager.setDefaultValues(this, PREFS_NAME, Context.MODE_PRIVATE, R.xml.preference, false);

আমি আশা করি এটি কারও সাহায্য করতে পারে।


13

পিক্সেলের গৃহীত উত্তরে:

PreferenceManager.setDefaultValues(this, R.xml.preference, false);

এটি উল্লেখ করা হয়েছে যে falseডিফল্টগুলি ওভাররাইট করা হবে না। এটি যা এটি করে তা নয়, আপনার অ্যাপ্লিকেশনটিতে একাধিক এন্ট্রি পয়েন্ট থাকলে পার্সিং বন্ধ করা কেবল দক্ষতার পতাকা। দুর্ভাগ্যক্রমে পরীক্ষাটি প্রতি পছন্দ ফাইল হিসাবে তৈরি করা হয় না, সুতরাং আপনার যদি একাধিক পছন্দের ফাইল থাকে তবে আপনাকে অবশ্যই trueপ্রথমটি বাদ দিয়ে সমস্ত কোড করতে হবে ।

আপনি যদি দক্ষতা সম্পর্কে চিন্তিত হন তবে আপনি এরকম কিছু কোড করতে পারেন।

final static private int SPL = 1;
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
if (sp.getInt("spl", 0) != SPL)
{
    PreferenceManager.setDefaultValues(this, R.xml.prefs1, true);
    PreferenceManager.setDefaultValues(this, R.xml.prefs2, true);
    sp.edit().putInt("spl", SPL).apply();
}

আপনি যদি আরও বেশি ভাগ করা পছন্দগুলি যুক্ত করেন তবে কেবল একটি হাইট সংখ্যায় এসপিএল সেট করুন।


2
বিকল্প হিসাবে, আপনি সর্বদা একটি বাল্ক পছন্দসমূহ। XML তৈরি করতে পারেন যা আপনি কেবলমাত্র ডিফল্ট মান নির্ধারণের জন্য ব্যবহার করেন। উদাহরণস্বরূপ, যদি আপনি আছে যদি R.xml.prefs_device, R.xml.prefs_testএবং R.xml.prefs_admin। আপনি এক অগ্রাধিকারগুলি যে ফাইলটি উপরে থেকে অগ্রাধিকারগুলি সব রয়েছে তৈরি করতে পারেন: R.xml.prefs_for_loading_default_values। তারপরে এটি ব্যবহার করুন PreferenceManager.setDefaultValues(this, R.xml.prefs_for_loading_default_values, false);
চ্যান্টেল ওসেজো

দক্ষতা সম্পর্কিত: আপনি যদি এটিকে কল (ম্যানিফেস্টে নিবন্ধিত) onCreate()এর একটি সাবক্লাসে কল করেন তবে যেকোনওর জন্য Applicationঅ্যাপ্লিকেশন শুরু হওয়ার পরে কেবল একবার এটি কল করা হবে। পারফরম্যান্সের জন্য এটি অ্যাপ্লিকেশন শুরু হওয়ার সময় পার্সিং না করা আরও প্রাসঙ্গিক (যদি আদৌ হয়) তবে এটি কেবল তার প্রথম শুরুতে হবে) এবং এটিই falseঘটে। সুতরাং আপনার প্রতিটি প্রারম্ভের (যেমন, যখন নতুন পছন্দগুলি যুক্ত করা যেতে পারে) পরীক্ষা করতে হবে বা প্রথম শুরুতে (বা পছন্দগুলি পুনরায় সেট করা) করা হয়েছে কিনা তা যথেষ্ট কিনা তা আরও প্রশ্ন।
ব্যবহারকারী 905686

2

উদাহরণস্বরূপ DialogPreferenceআমি এই কাজটি করে:

@Override
protected void onSetInitialValue(boolean restore, Object defaultValue) {
    super.onSetInitialValue(restore, defaultValue);

    if (restore) {
        mValue = shouldPersist() ? getPersistedString(mDefault) : mDefault;
    } else {
        mValue = mDefault;
    }
}

এমডিফল্ট হতে পারে:

  • এমকন্টেক্সট.জেট রিসোর্সস ()। গেটস্ট্রিং (অ্যাট্রেস.সেটআট্রিবিউটআরসোর্সভ্যালু (অ্যান্ড্রয়েডস, "ডিফল্টভ্যালু", 100%));
  • আপনি আর কে সূচকযুক্ত কিছু

ঠিক আছে, আপনি কী অর্জন করতে চাইছেন সে সম্পর্কে আমি এখানে কিছুটা হারিয়েছি। আমি ডায়ালগপ্রিফারেন্সকে কল করতে চাই না, যখন ব্যবহারকারী পছন্দগুলি ব্যবহার করে না তখন আমার ডিফল্ট মান দরকার need
পিটারডকে

আপনার prefs.xml এ ডিফল্ট পছন্দগুলি ব্যবহার করার পরিবর্তে আপনি নিজের ক্লাস তৈরি করতে পারেন। উদাহরণস্বরূপ আপনি ডায়ালগপ্রেফারেন্স থেকে প্রসারিত একটি নতুন ডায়ালগপ্রেফারেন্স তৈরি করতে এবং onSetInitialValue ওভাররাইড করতে পারেন।
ম্যাকার্সে

0

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.