Android Preferences Onclick Event
Solution 1:
You need to set android:key
for the item:
<Preferenceandroid:key="myKey"android:title="About" />
Then you can do the following in your code:
PreferencemyPref= (Preference) findPreference("myKey");
myPref.setOnPreferenceClickListener(newOnPreferenceClickListener() {
publicbooleanonPreferenceClick(Preference preference) {
// open browser or intent herereturntrue;
}
});
Solution 2:
to launch a website:
<PreferenceScreenandroid:title="website"><intentandroid:action="android.intent.action.VIEW"android:data="http://www.example.com"
/></PreferenceScreen>
to launch a specific activity:
<PreferenceScreenandroid:title="something"><intentandroid:action="android.intent.action.MAIN"android:targetPackage="com.example.foo"android:targetClass="com.example.foo.SomeActivity"
/></PreferenceScreen>
you can also use "android:mimetype" to set the mimetype.
Solution 3:
You need to use onPreferenceTreeClick event.
For example see http://www.javased.com/index.php?source_dir=platform_packages_apps_phone/src/com/android/phone/MobileNetworkSettings.java
@Overridepublic boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
/** TODO: Refactor and get rid of the if's using subclasses */if (mGsmUmtsOptions != null &&
mGsmUmtsOptions.preferenceTreeClick(preference) == true) {
returntrue;
} elseif (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);
}
returntrue;
} elseif (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));
returntrue;
} elseif (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);
}
returntrue;
} elseif (preference == mButtonDataEnabled) {
if (DBG) log("onPreferenceTreeClick: preference == mButtonDataEnabled.");
ConnectivityManager cm =
(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
cm.setMobileDataEnabled(mButtonDataEnabled.isChecked());
returntrue;
} elseif (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");
}
returntrue;
} 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 returnfalse;
}
}
Solution 4:
2018+ UPDATE
Today, the findPreference
method is depricated. So, to achieve this, just override the onPreferenceTreeClick
method in your Preference fragment. For example:
publicclassMySettingsFragmentextendsPreferenceFragment {
@OverridepublicbooleanonPreferenceTreeClick(PreferenceScreen preferenceScreen,
Preference preference)
{
Stringkey= preference.getKey();
if(key.equals("someKey")){
// do your workreturntrue;
}
returnfalse;
}
}
Furthermore, if you need to handle a click inside particular preference element (e.g. ListPreference
), you should register the setOnPreferenceChangeListener
inside the onCreate
method of the MySettingsFragment
:
@OverridepublicvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load the preferences from an XML resourceaddPreferencesFromResource(R.xml.preferences);
// register listener
final Preference prefList = findPreference("key");
prefList.setOnPreferenceChangeListener(newPreference.OnPreferenceChangeListener() {
publicbooleanonPreferenceChange(Preference preference, Object value) {
System.out.println("Selected: " + value);
returntrue;
}
});
}
Solution 5:
A followup on @jason gilbert's answer
I'm on targetSdkVersion 25, and his answer didn't work, I had to wrap the intent tag with a Preference tag. Example:
<PreferenceScreenandroid:title="something"><Preferencetitle="Title"><intentandroid:action="android.intent.action.MAIN"android:targetPackage="com.example.foo"android:targetClass="com.example.foo.SomeActivity"
/></Preference></PreferenceScreen>
Post a Comment for "Android Preferences Onclick Event"