অ্যানড্রয়েড পছন্দগুলি অনক্লিক ইভেন্ট


111

আমার পছন্দসমূহে। এক্সএমএলটিতে আমার পছন্দ মতো উপাদান রয়েছে:

<Preference android:title="About" />

আমি onClickইভেন্টটি বরাদ্দ করতে চাই , সুতরাং যদি ব্যবহারকারীরা এটিতে ক্লিক করে, আমি নতুন Intentবা ব্রাউজার খুলতে সক্ষম হব । আমি বোতামগুলির মতো করে এটি করার চেষ্টা করেছি, তবে এটি কার্যকর হবে বলে মনে হচ্ছে না।

উত্তর:


230

বদর,

android:keyআপনার আইটেমটির জন্য সেট করতে হবে, তারপরে আপনার কোডে আপনি যা করতে পারেন ...

ধরে নিচ্ছি যে আপনি আপনার এক্সএমএলে নিম্নলিখিতটি ব্যবহার করেছেন:

<Preference android:title="About" android:key="myKey"></Preference>

তারপরে আপনি আপনার কোডে নিম্নলিখিতগুলি করতে পারেন:

Preference myPref = (Preference) findPreference("myKey");
myPref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
             public boolean onPreferenceClick(Preference preference) {
                 //open browser or intent here
                 return true;
             }
         });

3
আমি এটি কোথায় রাখব? আমার onPostCreateসেটিংসঅ্যাক্টিভিটি অ্যাকটিভিটি ইন অভ অভ ওয়ার্ক কারণ এটি খুব তাড়াতাড়ি (নালপয়েন্টার-এক্সেপশন)। যে কোনও সহায়তার প্রশংসা করা হয়েছে
ওয়ানডাং

1
findPreferenceঅবচয় করা হয়।
জ্যাকিগৌরভ

6
PreferenceActivity.findPreferenceঅবচয় করা হয়। তবে ডকুমেন্টেশনটিতে বলা হয়েছে "[টি] তার কার্যকারিতাটি এখন নতুন পছন্দফ্রেগমেন্ট ক্লাসে পাওয়া উচিত you আপনি যদি এটির পুরানো মোডে পছন্দসই ব্যবহার করেন, তবে ডকুমেন্টেশনটি এখানে অবহিত এপিআইগুলিতে প্রযোজ্য" ", এবং PreferenceFragment.findPreferenceঅবমানিত নয় (এপিআই হিসাবে লেভেল 23, লেখার সময় বর্তমান)। সুতরাং, findPreferenceনিজেই হ্রাস করা হয় না; এটি হ'ল সরাসরি ব্যবহার PreferenceActivityযা হ্রাস করা হয়। গুগল চায় যে আমরা এর PreferenceFragmentপরিবর্তে চলে যাই , পরিত্যাগ না করি findPreference
মাইক প্লে

ইন onPreferenceClick, trueক্লিক অন্য কোনও হ্যান্ডেল করা ছিল যদি ফিরে false
Thupten

এটি আমার জন্য পছন্দের ফ্রেমক্যাম্পটডিভিডার্সে কাজ করে।
জোসেফ ল্যাম

59

একটি ওয়েবসাইট চালু করতে:

<PreferenceScreen android:title="website">
    <intent
        android:action="android.intent.action.VIEW"
        android:data="http://www.example.com"
        />
</PreferenceScreen>

একটি নির্দিষ্ট কার্যকলাপ চালু করতে:

<PreferenceScreen android:title="something">
    <intent
        android:action="android.intent.action.MAIN"
        android:targetPackage="com.example.foo"
        android:targetClass="com.example.foo.SomeActivity"
        />
</PreferenceScreen>

মাইমটাইপ সেট করতে আপনি "অ্যান্ড্রয়েড: মাইমটাইপ" ব্যবহার করতে পারেন ।


1
আমি সম্মত, এই পদ্ধতিটি আরও ভাল, বিশেষত কারণ এটি এখন অবহেলিত ফাইন্ডান্সফারেন্স (স্ট্রিং কী) পদ্ধতি ব্যবহার করে না এবং এটি সামগ্রিকভাবে কেবল ক্লিনার।
লাইলকুপার

খুব সুন্দর, তবে কী এভাবে ইন্টেন্টচিজার তৈরি করা সম্ভব?
পিটারডকে

@ জাসংগিলবার্ট কি পছন্দের ক্লিক থেকে ক্রিয়াকলাপ শুরু করার পরিবর্তে অ্যাকশন দিয়ে একটি সম্প্রচার পাঠানো সম্ভব?
সাজ্জাদ হিশাইন খান

1
@ জাসংগিলবার্ট আমি কি intent-filterম্যানিফেস্টে কিছু উল্লেখ করতে পারি SomeActivity, ActivityNotFoundException
কিউজ পাচ্ছি

11

আপনাকে প্রিফারেন্সট্রি ক্লিক ইভেন্টটি ব্যবহার করতে হবে।

উদাহরণস্বরূপ দেখুন http://www.javased.com/index.php?source_dir=platform_packages_apps_ iPhone/src/com/android/ iPhone/MobileNetworkSettings.java

 @Override 
    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { 
        /** TODO: Refactor and get rid of the if's using subclasses */ 
        if (mGsmUmtsOptions != null && 
                mGsmUmtsOptions.preferenceTreeClick(preference) == true) { 
            return true; 
        } else if (mCdmaOptions != null && 
                   mCdmaOptions.preferenceTreeClick(preference) == true) { 
            if (Boolean.parseBoolean( 
                    SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE))) { 

                mClickedPreference = preference; 

                // In ECM mode launch ECM app dialog 
                startActivityForResult( 
                    new Intent(TelephonyIntents.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS, null), 
                    REQUEST_CODE_EXIT_ECM); 
            } 
            return true; 
        } else if (preference == mButtonPreferredNetworkMode) { 
            //displays the value taken from the Settings.System 
            int settingsNetworkMode = android.provider.Settings.Secure.getInt(mPhone.getContext(). 
                    getContentResolver(), android.provider.Settings.Secure.PREFERRED_NETWORK_MODE, 
                    preferredNetworkMode); 
            mButtonPreferredNetworkMode.setValue(Integer.toString(settingsNetworkMode)); 
            return true; 
        } else if (preference == mButtonDataRoam) { 
            if (DBG) log("onPreferenceTreeClick: preference == mButtonDataRoam."); 

            //normally called on the toggle click 
            if (mButtonDataRoam.isChecked()) { 
                // First confirm with a warning dialog about charges 
                mOkClicked = false; 
                new AlertDialog.Builder(this).setMessage( 
                        getResources().getString(R.string.roaming_warning)) 
                        .setTitle(android.R.string.dialog_alert_title) 
                        .setIconAttribute(android.R.attr.alertDialogIcon) 
                        .setPositiveButton(android.R.string.yes, this) 
                        .setNegativeButton(android.R.string.no, this) 
                        .show() 
                        .setOnDismissListener(this); 
            } else { 
                mPhone.setDataRoamingEnabled(false); 
            } 
            return true; 
        } else if (preference == mButtonDataEnabled) { 
            if (DBG) log("onPreferenceTreeClick: preference == mButtonDataEnabled."); 
            ConnectivityManager cm = 
                    (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 

            cm.setMobileDataEnabled(mButtonDataEnabled.isChecked()); 
            return true; 
        } else if (preference == mLteDataServicePref) { 
            String tmpl = android.provider.Settings.Secure.getString(getContentResolver(), 
                        android.provider.Settings.Secure.SETUP_PREPAID_DATA_SERVICE_URL); 
            if (!TextUtils.isEmpty(tmpl)) { 
                TelephonyManager tm = (TelephonyManager) getSystemService( 
                        Context.TELEPHONY_SERVICE); 
                String imsi = tm.getSubscriberId(); 
                if (imsi == null) { 
                    imsi = ""; 
                } 
                final String url = TextUtils.isEmpty(tmpl) ? null 
                        : TextUtils.expandTemplate(tmpl, imsi).toString(); 
                Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); 
                startActivity(intent); 
            } else { 
                android.util.Log.e(LOG_TAG, "Missing SETUP_PREPAID_DATA_SERVICE_URL"); 
            } 
            return true; 
        } else { 
            // if the button is anything but the simple toggle preference, 
            // we'll need to disable all preferences to reject all click 
            // events until the sub-activity's UI comes up. 
            preferenceScreen.setEnabled(false); 
            // Let the intents be launched by the Preference manager 
            return false; 
        } 
    } 

লিঙ্কটি 404
জেডজেইউ

6

2018+ আপডেট আজ, findPreferenceপদ্ধতিটি বর্ণিত। সুতরাং, এটি অর্জন করতে, কেবল onPreferenceTreeClickআপনার পছন্দসই খণ্ডে পদ্ধতিটি ওভাররাইড করুন । উদাহরণ স্বরূপ:

public class MySettingsFragment extends PreferenceFragment {

    @Override
    public boolean onPreferenceTreeClick (PreferenceScreen preferenceScreen,
                                          Preference preference)
    {
        String key = preference.getKey();
        if(key.equals("someKey")){
            // do your work
            return true;
        }
        return false;
    }
}

তদ্ব্যতীত, যদি আপনাকে নির্দিষ্ট পছন্দসই উপাদানগুলির মধ্যে একটি ক্লিক পরিচালনা করতে হয় (উদাহরণস্বরূপ ListPreference), আপনার setOnPreferenceChangeListenerনীচের onCreateপদ্ধতির অভ্যন্তরে নিবন্ধন করতে হবে MySettingsFragment:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Load the preferences from an XML resource
    addPreferencesFromResource(R.xml.preferences);

    // register listener
    final Preference prefList = findPreference("key");
    prefList.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
        public boolean onPreferenceChange(Preference preference, Object value) {
            System.out.println("Selected: " + value);
            return true;
        }
    });
}

মধ্যে পার্থক্য কি onPreferenceClickএবং onPreferenceTreeClick ?
ইউশা আলেয়ুব

3

@ জেসন গিলবার্টের উত্তরের একটি অনুসরণ

আমি টার্গেটএসডিপি ভার্সন 25 এ আছি , এবং তার উত্তরটি কার্যকর হয়নি, আমাকে পছন্দ ট্যাগ দিয়ে অভিপ্রায় ট্যাগটি মোড়তে হয়েছিল। উদাহরণ:

<PreferenceScreen android:title="something">
    <Preference title="Title">
       <intent
       android:action="android.intent.action.MAIN"
       android:targetPackage="com.example.foo"
       android:targetClass="com.example.foo.SomeActivity"
       />
    </Preference>
</PreferenceScreen>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.