পছন্দেরঅ্যাকটিভিটিতে "অ্যাডপ্রিফারেন্সফ্রম রিসোর্স" এর পরিবর্তে কী ব্যবহার করবেন?


360

আমি কেবল এই বিষয়টি লক্ষ্য করেছি যে পদ্ধতিটি অ্যান্ড্রয়েডের ডকুমেন্টেশনে ( রেফারেন্স এন্ট্রি ) অবচয়addPreferencesFromResource(int preferencesResId) হিসাবে চিহ্নিত হয়েছে marked

দুর্ভাগ্যক্রমে, পদ্ধতির বর্ণনায় কোনও বিকল্প পদ্ধতি সরবরাহ করা হয়নি।

কোন পছন্দকে স্ক্রিন.এক্সএমএল এর সাথে মেলে পছন্দসইটির সাথে সংযোগ করতে পরিবর্তে কোন পদ্ধতিটি ব্যবহার করা উচিত?


2
খুব সহজবোধ্য পদ্ধতির এ WannaGetHigh দ্বারা প্রদান করা হয় stackoverflow.com/questions/23523806/...
সাবিন

সমাধানটি এখনও ব্যবহার করে addPreferencesFromResource(int preferencesResId)। আমি কিছু অনুপস্থিত করছি ?
জম্মো

@ জম্মো হ্যাঁ তবে এটি করা -> খণ্ডের নতুন পদ্ধতি প্রতিফলিত করার জন্য এটি ক্রিয়াকলাপ থেকে খণ্ডে সরানো হয়েছে।
WannaGetHigh

উত্তর:


332

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


উত্তরের জন্য তোমাকে অনেক ধন্যবাদ. আমি কেবল "ভিডিও 2ব্রাইন-অ্যান্ড্রয়েড বিকাশ" থেকে অবহেলিত নির্দেশনা অনুসরণ করছিলাম যা আমাকে পদ্ধতির পছন্দসইটির সংস্করণ ব্যবহার করতে পরিচালিত করেছিল। বিটিডব্লিউ: আমি যদি আপনার উত্তরটি দরকারী হিসাবে নির্ধারণ করতে চাই তবে যদি আমি কেবল পারতাম।
mweisz

33
এখন কেবলমাত্র যদি অগ্রাধিকারের খণ্ডটি
প্রশ্নগুলি /

1
যেহেতু আমি অ্যাকশন দণ্ডে শার্লক ব্যবহার, আমি এই সমস্যা সমাধানের জন্য নিম্নলিখিত ব্লগ অনুসৃত দেখুন ... commonsware.com/blog/2012/10/16/...
কেউ কোথাও

2
তবুও আপনি যদি অ্যাপ্লিকেশনটিকে 11 (অ্যান্ড্রয়েড 3.0) এর চেয়ে বেশি এপি লেভেলের সাথে সামঞ্জস্যপূর্ণ করতে চান তবে আপনাকে অ্যাডপ্রিফারেন্সফ্রম রিসোর্স (ইন্ট প্রেফারেন্সআইডি) কল করতে হবে। তবে আমার ধারণা আপনি সেই পুরানো ডিভাইসগুলিও অবনমিত হিসাবে বিবেচনা করতে পারেন।
আইনার সুন্দরগ্রেন

5
@ আইনারসুন্ডগ্রেন আমি নেক্সাস ওয়ান এর মালিক এবং আমার সর্বোচ্চ উপলব্ধ সংস্করণটি ২.২: আপনি আমাকে থামবেন না! আমি কখনও হতাশ হব না! গ্র্যাস্কুলের শক্তি দ্বারা ... আমার ক্ষমতা আছে!
টেকনিকুইস্ট

186

উপরের সঠিক উত্তরে আরও তথ্য যুক্ত করতে, অ্যান্ড্রয়েড-এআর থেকে একটি উদাহরণ পড়ার পরে আমি পেয়েছি যে আপনি সহজেই নিজের পছন্দ ক্রিয়াকে পছন্দসই খণ্ডে রূপান্তর করতে পারেন। আপনার যদি নিম্নলিখিত ক্রিয়াকলাপ থাকে:

public class MyPreferenceActivity extends PreferenceActivity
{
    @Override
    protected void onCreate(final Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.my_preference_screen);
    }
}

আপনার কেবলমাত্র পরিবর্তনগুলি হ'ল একটি অভ্যন্তরীণ খণ্ড শ্রেণি তৈরি addPreferencesFromResources()করা, খণ্ডে সরানো এবং ক্রিয়াকলাপ থেকে খণ্ডটিকে অনুরোধ করা যেমন:

public class MyPreferenceActivity extends PreferenceActivity
{
    @Override
    protected void onCreate(final Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        getFragmentManager().beginTransaction().replace(android.R.id.content, new MyPreferenceFragment()).commit();
    }

    public static class MyPreferenceFragment extends PreferenceFragment
    {
        @Override
        public void onCreate(final Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.my_preference_screen);
        }
    }
}

টুকরোগুলি থেকে আরও জটিল পছন্দগুলি করার জন্য অন্যান্য সূক্ষ্মতা থাকতে পারে; যদি তা হয় তবে আমি আশা করি কেউ এখানে সেগুলি নোট করেছেন।


6
ভাল, এই জন্য ধন্যবাদ। জাভা এবং এই ধরণের চিন্তাভাবনা এখনও পর্যন্ত আমার সুন্দর ছোট নেট নেট থেকে সরিয়ে দেওয়া হয়েছে :)
টম

44
কেন তারা addPreferencesFromResources()অগ্রাধিকারের বাণিজ্যে অবমূল্যায়ন করবে ? এটি প্রথম দিকের দৃষ্টিকোণ থেকে অপ্রয়োজনীয় দেখায়।
হাওডি_এমসিজি

4
কলটির জন্য API স্তরের 11
মেহমেট

1
তাহলে এপিআই লেভেল 9 এ থাকলে কী হবে? @ মেমমেট
গুমুরুহ

2
দুর্দান্ত উত্তর! এন্ড্রয়েড.আর.আইডি.কন্টেন্ট পরিবর্তন না করে এ অর্জনের কোনও উপায় আছে কি? কোনও কারণে আমার কাছে
অপ্রয়োজনীয়

37

@ গ্রেট উইলসন আপনাকে অনেক ধন্যবাদ! অ্যান্ড্রয়েড কোডিংয়ের এক নুবি হিসাবে, আমি বেশ কয়েক ঘন্টা ধরে পছন্দগুলি অসঙ্গতি ইস্যুটির সাথে আটকে আছি এবং আমি এটি এতটাই হতাশাবোধ করি যে তারা পুরানো এপিআই দ্বারা সমর্থিত নয় এমন কিছু পদ্ধতির / পদ্ধতির ব্যবহারকে অবজ্ঞা করেছে thus আপনার অ্যাপ্লিকেশনটিকে বিস্তৃত ডিভাইসগুলিতে কাজ করতে সমস্ত ধরণের workaround অবলম্বন করতে হবে। সত্যিই হতাশার!

আপনার ক্লাসটি দুর্দান্ত, কারণ এটি আপনাকে আগে যেমন পছন্দ করে নতুন APIs এ কাজ চালিয়ে যাওয়ার অনুমতি দেয় তবে এটি পশ্চাদপটে সামঞ্জস্যপূর্ণ নয়। যেহেতু আমি প্রি এপিআই 11 ডিভাইসগুলির পাশাপাশি নতুন নতুন এপিআইতে এটির কাজ করার জন্য আমি এটির সাথে বিস্তৃত ডিভাইসগুলি পৌঁছানোর চেষ্টা করছি:

import android.annotation.TargetApi;
import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.preference.PreferenceFragment;

public class MyPrefsActivity extends PreferenceActivity
{
    private static int prefs=R.xml.myprefs;

    @Override
    protected void onCreate(final Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        try {
            getClass().getMethod("getFragmentManager");
            AddResourceApi11AndGreater();
        } catch (NoSuchMethodException e) { //Api < 11
            AddResourceApiLessThan11();
        }
    }

    @SuppressWarnings("deprecation")
    protected void AddResourceApiLessThan11()
    {
        addPreferencesFromResource(prefs);
    }

    @TargetApi(11)
    protected void AddResourceApi11AndGreater()
    {
        getFragmentManager().beginTransaction().replace(android.R.id.content,
                new PF()).commit();
    }

    @TargetApi(11)
    public static class PF extends PreferenceFragment
    {       
        @Override
        public void onCreate(final Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(MyPrefsActivity.prefs); //outer class
            // private members seem to be visible for inner class, and
            // making it static made things so much easier
        }
    }
}

সাফল্যের সাথে দুটি এমুলেটর পরীক্ষিত (2.2 এবং 4.2)।

আমার কোডটি কেন এত খারাপ দেখাচ্ছে:

আমি অ্যান্ড্রয়েড কোডিংয়ের নুব, আর আমি জাভা ফ্যান নই।

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

আমি আমার এক্সএমএল রিসোর্স আইডি লিখতে চাই না যখনই আমি ক্লাসটি অনুলিপি করে একটি নতুন পছন্দঅ্যাক্টিভিটির জন্য পেস্ট করে রাখি, তাই এই মানটি সংরক্ষণ করার জন্য আমি একটি নতুন ভেরিয়েবল তৈরি করেছি।

আমি আশা করি এটি অন্য কারও কাজে লাগবে।

পিএস: আমার মতামত মতামত জন্য দুঃখিত, কিন্তু আপনি নতুন এসে এই জাতীয় প্রতিবন্ধগুলি খুঁজে পেলে হতাশ হওয়ার জন্য আপনি এটিকে সহায়তা করতে পারবেন না!


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

... তাত্ক্ষণিক হয়েছে। সুতরাং আপনাকে অভ্যন্তর শ্রেণিতে একটি নতুন ভেরিয়েবল তৈরি করতে হবে, তার জন্য অভ্যন্তরীণ শ্রেণিতে একটি সর্বজনীন সেট পদ্ধতি তৈরি করতে হবে, অ্যাডপ্রিফারেন্সফ্রোম রিসোর্সটি যেখানে সুপার.অনক্রিটের কল করার পরে রয়েছে, অনক্রিটের অভ্যন্তরে, অভ্যন্তরীণ শ্রেণিকে ইনস্ট্যান্ট করুন, প্রিফেস সেট করুন , এবং এটি পূর্বের মত ফ্রেমমেন্টম্যানেজার () ... পেতে কলটিতে ব্যবহার করুন।
ecv

2
আপনার কোড একটি জীবনকালীন হয়েছে !! আমি পুরানো এবং নতুন ফোন উভয়কেই টার্গেট করার চেষ্টা করছিলাম, এবং 3 দিন নষ্ট করলাম..আর উত্তরটি এত সহজ। ধন্যবাদ
দেবদত্ত টেংশে

22

আমার পদ্ধতির গ্যারেট উইলসনের খুব কাছে (ধন্যবাদ, আমি আপনাকে ভোট দিয়েছি;)

এছাড়াও এটি অ্যান্ড্রয়েড <3 এর সাথে নিম্নমুখী সামঞ্জস্যতা সরবরাহ করে।

আমি কেবল স্বীকৃতি দিয়েছি যে কেভিন রেমো দ্বারা আমার সমাধানটির আরও কাছাকাছি । এটি কেবলমাত্র একটি বিট ক্লিনার (এটি "এক্সপশন" অ্যান্টিপ্যাটার্নের উপর নির্ভর করে না )।

public class MyPreferenceActivity extends PreferenceActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
            onCreatePreferenceActivity();
        } else {
            onCreatePreferenceFragment();
        }
    }

    /**
     * Wraps legacy {@link #onCreate(Bundle)} code for Android < 3 (i.e. API lvl
     * < 11).
     */
    @SuppressWarnings("deprecation")
    private void onCreatePreferenceActivity() {
        addPreferencesFromResource(R.xml.preferences);
    }

    /**
     * Wraps {@link #onCreate(Bundle)} code for Android >= 3 (i.e. API lvl >=
     * 11).
     */
    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    private void onCreatePreferenceFragment() {
        getFragmentManager().beginTransaction()
                .replace(android.R.id.content, new MyPreferenceFragment ())
                .commit();
    }
}

একটি "বাস্তব" (তবে আরও জটিল) উদাহরণের জন্য NusicPreferencesActivity এবং NusicPreferencesFraਮੈਂਟ দেখুন


@SuppressLint("NewApi")- এড়ানো - আরও সুনির্দিষ্ট করা। আপনি কি এটি কম অ্যাপসের জন্য চালাচ্ছেন? এটি নিক্ষেপ করবেVerifyError
Mr_and_Mrs_D

আমি এমুলেটরটি চলমান এপিএল লেভেল 10 তে চলমান উপরে পরীক্ষা করে দেখছি, এসপিকে সংস্করণ 19 ব্যবহার করে নির্মিত হয়েছিল APK you আপনি কোন ডিভাইসের এপিআই স্তরটি এটি চালিয়েছেন? আপনি এটি এমুলেটর বা কোনও শারীরিক ডিভাইসে চালিত করেছেন? ত্রুটি কখন ঘটল? যদি এসডিকে <= 16 দিয়ে উর বিল্ডিং হয় তবে এই প্রতিক্রিয়াটি দেখুন
schnatterer

আপনি বিন্দুটি মিস করছেন - এবং আপনি যদি আমাকে বিজ্ঞপ্তি করতে চান তবে @ মিআর_আর_এমএস_ডি যোগ করুন। ভি.ই. এর জন্য এখানে পড়ুন: stackoverflow.com/questions/20271593/…@SuppressLint("NewApi")শুধু খারাপ স্টাইল
Mr_and_Mrs_D

@ এম আচ্ছা তবে, @SuppressLint("NewApi")এই বিশেষ পরিস্থিতিতে এড়াতে কীভাবে একটি প্রস্তাব সম্পর্কে ?
schnatterer

@TargetApi(Build.VERSION_CODES.HONEYCOMB)- কোনও এপিআই-এর জন্য সমস্ত সতর্কতা নয় :)
মিঃ_আর_এমএস_ডি

6

ব্যতিক্রমগুলির পরিবর্তে, কেবল ব্যবহার করুন:

if (Build.VERSION.SDK_INT >= 11)

আর ব্যবহার করুন

@SuppressLint("NewApi")

সতর্কতা দমন করতে।


1
কারণ এটি ক্র্যাশ ছাড়া আর কিছুই করে না: ডি
ইশতিয়াক

1
যদি এটি ক্রাশ হয় ... তবে চেষ্টা করুন এবং এটি ধরুন: ডি
গমুরুহ

0

PreferenceActivityসরাসরি লোড পছন্দগুলিতে এ ব্যবহার করার পরিবর্তে এমন একটি AppCompatActivityবা সমতুল্য ব্যবহার করুন PreferenceFragmentCompatযা আপনার পছন্দগুলি লোড করে load এটি সমর্থন লাইব্রেরির অংশ (এখন অ্যান্ড্রয়েড জেটপ্যাক) এবং এপিআই 14-তে সামঞ্জস্যতা সরবরাহ করে।

আপনার মধ্যে build.gradle, পছন্দ সমর্থন লাইব্রেরির জন্য নির্ভরতা যুক্ত করুন:

dependencies {
    // ...
    implementation "androidx.preference:preference:1.0.0-alpha1"
}

দ্রষ্টব্য: আমরা ধরে নিচ্ছি যে আপনার পছন্দসই এক্সএমএল ইতিমধ্যে তৈরি হয়েছে।

আপনার ক্রিয়াকলাপের জন্য, একটি নতুন ক্রিয়াকলাপ তৈরি করুন। আপনি যদি উপাদানীয় থিমগুলি ব্যবহার করছেন তবে আপনার এটির প্রসার বাড়ানো উচিত AppCompatActivityতবে আপনি এতে নমনীয় হতে পারেন:

public class MyPreferencesActivity extends AppCompatActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_preferences_activity)
        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.fragment_container, MyPreferencesFragment())
                    .commitNow()
        }
    }
}

এখন গুরুত্বপূর্ণ অংশটির জন্য: একটি টুকরো তৈরি করুন যা XML থেকে আপনার পছন্দগুলি লোড করে:

public class MyPreferencesFragment extends PreferenceFragmentCompat {

    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        setPreferencesFromResource(R.xml.my_preferences_fragment); // Your preferences fragment
    }
}

আরো তথ্যের জন্য, অ্যান্ড্রয়েড ডেভেলপারগণ পড়া ডক্স জন্য PreferenceFragmentCompat

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