Android preferences onclick event

后端 未结 5 1510
轻奢々
轻奢々 2020-12-22 22:15

In my preferences.xml I have a preference element like this:


I want to assign onClick

相关标签:
5条回答
  • 2020-12-22 22:52

    Badr,

    You need to set android:key for the item, Then in your code you can do...

    Assuming you use the following in your XML:

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

    Then you can do the following in your code:

    Preference myPref = (Preference) findPreference("myKey");
    myPref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
                 public boolean onPreferenceClick(Preference preference) {
                     //open browser or intent here
                     return true;
                 }
             });
    
    0 讨论(0)
  • 2020-12-22 22:56

    to launch a website:

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

    to launch a specific activity:

    <PreferenceScreen android:title="something">
        <intent
            android: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.

    0 讨论(0)
  • 2020-12-22 23:00

    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:

    <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>
    
    0 讨论(0)
  • 2020-12-22 23:01

    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

     @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; 
            } 
        } 
    
    0 讨论(0)
  • 2020-12-22 23:02

    2018+ UPDATE Today, the findPreference method is depricated. So, to achieve this, just override the onPreferenceTreeClick method in your Preference fragment. For example:

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

    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:

    @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;
            }
        });
    }
    
    0 讨论(0)
提交回复
热议问题