Android tercihleri ​​onclick olayı


111

Preferences.xml dosyamda şöyle bir tercih öğem var:

<Preference android:title="About" />

onClickOlay atamak istiyorum , böylece kullanıcı üzerine tıklarsa, yeni Intentveya tarayıcı açabilirim. Düğmelerle yaptığım gibi yapmaya çalıştım ama bu işe yaramıyor gibi görünüyor.

Yanıtlar:


230

Badr,

android:keyÖğe için ayarlamanız gerekiyor , Sonra kodunuzda yapabilirsiniz ...

XML'nizde aşağıdakileri kullandığınızı varsayarsak:

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

Ardından kodunuzda aşağıdakileri yapabilirsiniz:

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

3
Bunu nereye yerleştirmeliyim? benim SettingsActivity içinde onPostCreatealışkanlık işin çok erken (Nullpointer-İstisna) olduğu için. Herhangi bir yardım için minnettarız
Wandang

2
findPreferencekullanımdan kaldırıldı.
zackygaurav 09

6
PreferenceActivity.findPreferencekullanımdan kaldırıldı. Ancak dokümantasyon "[T] işlevselliğinin artık yeni PreferenceFragment sınıfında bulunması gerektiğini söylüyor. PreferenceActivity'yi eski modunda kullanıyorsanız, buradaki dokümantasyon buradaki kullanımdan kaldırılan API'ler için geçerlidir." Ve PreferenceFragment.findPreferencekullanımdan kaldırılmamıştır (API itibariyle) seviye 23, yazım sırasında güncel). Yani, findPreferencekendisi kullanımdan kaldırılmış değil; doğrudan kullanımı kullanımdan PreferenceActivitykaldırılmıştır. Google PreferenceFragmentterk etmemizi değil, onun yerine taşınmamızı istiyor findPreference.
Mike Playle

İçinde onPreferenceClick, truetıklama başka şekilde işlendiyse geri dönün false.
Thupten

Bu benim için PreferenceFragmentCompatDividers ile çalışıyor.
Joseph Lam

59

bir web sitesi başlatmak için:

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

belirli bir etkinliği başlatmak için:

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

mime tipini ayarlamak için "android: mimetype" seçeneğini de kullanabilirsiniz .


1
Katılıyorum, bu yaklaşım daha iyi, özellikle artık kullanımdan kaldırılmış findPreference (String key) yöntemini kullanmadığı ve genel olarak daha temiz olduğu için.
lyallcooper

Çok güzel, ama bu şekilde bir IntentChooser oluşturmak da mümkün mü?
Peterdk

@jasongilbert Tercih tıklamasından aktivite başlatmak yerine ACTION ile yayın göndermek mümkün müdür?
Sazzad Hissain Khan

1
@jasongilbert intent-filteriçin bildirimde herhangi birini belirtmeli miyim SomeActivity, çünkü şunu alıyorum ActivityNotFoundException:(
theapache64

11

OnPreferenceTreeClick olayını kullanmanız gerekir.

Örneğin, http://www.javased.com/index.php?source_dir=platform_packages_apps_phone/src/com/android/phone/MobileNetworkSettings.java adresine bakın

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

Bağlantı 404
JZAU

6

2018+ GÜNCELLEME Bugün, findPreferenceyöntem kullanımdan kaldırılmıştır. Bu nedenle, bunu başarmak onPreferenceTreeClickiçin Tercih bölümünüzdeki yöntemi geçersiz kılmanız yeterlidir. Örneğin:

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

Ayrıca, belirli bir tercih öğesinin (ör. ListPreference) İçindeki bir tıklamayı işlemeniz gerekiyorsa setOnPreferenceChangeListener, onCreateyönteminin içini kaydetmelisiniz 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;
        }
    });
}

Arasındaki fark nedir onPreferenceClickve onPreferenceTreeClick ?
Yousha Aleayoub

3

@Jason Gilbert'ın cevabının devamı

Hattayım targetSdkVersion 25 ve onun cevabı ben Tercih etiketiyle niyet etiketi sarmak zorunda çalışmadı. Misal:

<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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.