web-dev-qa-db-fra.com

Android préférences événement onclick

Dans mon preferences.xml, j'ai un élément de préférence comme celui-ci:

<Preference Android:title="About" />

Je veux assigner l'événement onClick, ainsi si l'utilisateur clique dessus, je pourrai ouvrir un nouveau navigateur Intent. J'ai essayé de le faire comme je le fais avec des boutons, mais cela ne semble pas fonctionner.

104
Badr Hari

Badr,

Vous devez définir Android:key pour l'article, alors dans votre code, vous pouvez faire ...

En supposant que vous utilisiez les éléments suivants dans votre XML:

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

Ensuite, vous pouvez effectuer les opérations suivantes dans votre code:

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

pour lancer un site web:

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

pour lancer une activité spécifique:

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

vous pouvez également utiliser "Android: type MIME" pour définir le type MIME.

56
jason gilbert

Vous devez utiliser l'événement onPreferenceTreeClick.

Voir, par exemple, http://www.javased.com/index.php?source_dir=platform_packages_apps_phone/src/com/Android/phone/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; 
        } 
    } 
11
Pentium10

Un suivi sur la réponse de @jas gilbert

Je suis sur targetSdkVersion 25, et sa réponse n'a pas fonctionné. Je devais envelopper la balise d'intention avec une balise de préférence. Exemple:

<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>
3
Malek Hijazi

MISE À JOUR 2018 Aujourd'hui, la méthode findPreference est obsolète. Donc, pour cela, substituez simplement la méthode onPreferenceTreeClick dans votre fragment de préférence. Par exemple:

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