Préférences Android onclick événement
Dans mes préférences.xml j'ai un élément de préférence comme ceci:
<Preference android:title="About" />
Je veux attribuer onClick
événement, de sorte que si l'utilisateur clique sur elle, je serais capable d'ouvrir de nouveaux Intent
ou navigateur. J'ai essayé de faire comme je le fais avec des boutons, mais cela ne semble pas fonctionner.
4 réponses
Badr,
, Vous devez définir le android:key
pour l'élément, Puis dans votre code, vous pouvez le faire...
En supposant que vous utilisez ce qui suit dans votre XML:
<Preference android:title="About" android:key="myKey"></Preference>
Ensuite, vous pouvez faire ce qui suit dans votre code:
Preference myPref = (Preference) findPreference("myKey");
myPref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference preference) {
//open browser or intent here
return true;
}
});
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 aussi utiliser "android:mimetype" pour définir le type mime.
Vous devez utiliser l'événement onpreferencetreeclick.
Par exemple voir 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;
}
}
Un suivi sur la réponse de @ jason gilbert
Je suis sur targetSdkVersion 25, et sa réponse n'a pas fonctionné, j'ai dû envelopper la balise intent avec une balise Preference. 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>