Android Настройки onclick событие
в моих предпочтениях.xml у меня есть элемент предпочтения, как это:
<Preference android:title="About" />
Я хочу назначить onClick
событие, поэтому, если пользователь нажмет на него, я смогу открыть новый Intent
или браузер. Я пытался сделать это, как я делаю с кнопками, но это, кажется, не работает.
4 ответа:
Бадр,
необходимо указать
android:key
для элемента, то в коде можно сделать...предполагая, что вы используете следующее В своем XML:
<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; } });
создать сайт:
<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>
вы также можете использовать "android:mimetype" установить тип MIME.
вы должны использовать onpreferencetreeclick событие.
@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; } }
продолжение ответа @jason gilbert
Я targetSdkVersion 25, и его ответ не сработал, мне пришлось обернуть тег intent тегом Preference. Пример:
<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>