การตั้งค่า Android onclick เหตุการณ์


111

ในการตั้งค่า. xml ของฉันฉันมีองค์ประกอบการกำหนดลักษณะดังนี้:

<Preference android:title="About" />

ฉันต้องการกำหนดonClickเหตุการณ์ดังนั้นหากผู้ใช้คลิกที่มันฉันจะสามารถเปิดใหม่Intentหรือเบราว์เซอร์ได้ ฉันพยายามทำเหมือนใช้ปุ่ม แต่ดูเหมือนจะไม่ได้ผล

คำตอบ:


230

บาดร์

คุณต้องตั้งค่า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;
             }
         });

3
ฉันจะวางสิ่งนี้ไว้ที่ไหน? ใน SettingsActivity ของฉันonPostCreateจะไม่ทำงานเพราะเร็วเกินไป (Nullpointer-Exception) ขอความช่วยเหลือใด ๆ
Wandang

2
findPreferenceเลิกใช้แล้ว
zackygaurav

6
PreferenceActivity.findPreferenceเลิกใช้แล้ว อย่างไรก็ตามเอกสารระบุว่า "[T] ควรพบฟังก์ชันการทำงานของเขาในคลาส PreferenceFragment ใหม่หากคุณกำลังใช้ PreferenceActivity ในโหมดเก่าเอกสารในนั้นจะใช้กับ API ที่เลิกใช้งานที่นี่" และPreferenceFragment.findPreferenceจะไม่เลิกใช้งาน (ตาม API ระดับ 23 ปัจจุบัน ณ เวลาที่เขียน) ดังนั้นfindPreferenceตัวเองจึงไม่เลิกใช้งาน เป็นการใช้งานโดยตรงPreferenceActivityซึ่งเลิกใช้แล้ว Google ต้องการให้เราย้ายไปแทนไม่ได้ที่จะละทิ้งPreferenceFragment findPreference
Mike Playle

ในonPreferenceClickการกลับมาหากคลิกถูกจัดการอื่นtrue false
พฤหัสบดี

สิ่งนี้ใช้ได้กับฉันกับ PreferenceFragmentCompatDividers
Joseph Lam

59

ในการเปิดตัวเว็บไซต์:

<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"เพื่อตั้งค่า mimetype


1
ฉันเห็นด้วยวิธีนี้ดีกว่าโดยเฉพาะอย่างยิ่งเนื่องจากไม่ได้ใช้วิธี findPreference (คีย์สตริง) ที่เลิกใช้แล้วในขณะนี้และเนื่องจากโดยรวมแล้วสะอาดกว่า
lyallcooper

ดีมาก แต่เป็นไปได้ไหมที่จะสร้าง IntentChooser ด้วยวิธีนี้
Peterdk

@jasongilbert เป็นไปได้ไหมที่จะส่งออกอากาศด้วย ACTION แทนที่จะเริ่มกิจกรรมจากการคลิกความชอบ?
Sazzad Hissain Khan

1
@jasongilbert ฉันควรระบุสิ่งใดintent-filterในรายการสำหรับสิ่งที่SomeActivityได้รับเพราะActivityNotFoundException:(
theapache64

11

คุณต้องใช้เหตุการณ์ onPreferenceTreeClick

ตัวอย่างเช่นดู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; 
        } 
    } 

ลิงค์คือ 404
JZAU

6

2018+ UPDATE วันนี้หมดfindPreferenceวิธี ดังนั้นเพื่อให้บรรลุสิ่งนี้เพียงแค่แทนที่onPreferenceTreeClickวิธีการในส่วนการตั้งค่าของคุณ ตัวอย่างเช่น:

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

นอกจากนี้หากคุณต้องการที่จะจัดการกับการคลิกภายในองค์ประกอบการตั้งค่าเฉพาะ (เช่นListPreference) คุณควรลงทะเบียนsetOnPreferenceChangeListenerภายในonCreateวิธีการ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;
        }
    });
}

อะไรคือความแตกต่างระหว่างonPreferenceClickและonPreferenceTreeClick ?
Yousha Aleayoub

3

ติดตามคำตอบของ @jason gilbert

ฉันใช้targetSdkVersion 25และคำตอบของเขาใช้ไม่ได้ผลฉันต้องปิดแท็กความตั้งใจด้วยแท็กค่ากำหนด ตัวอย่าง:

<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>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.