Sự kiện onclick tùy chọn Android


111

Trong tùy chọn của tôi.xml, tôi có một phần tử tùy chọn như sau:

<Preference android:title="About" />

Tôi muốn chỉ định onClicksự kiện, vì vậy nếu người dùng nhấp vào nó, tôi có thể mở mớiIntent trình duyệt hoặc . Tôi đã cố gắng làm điều đó giống như tôi làm với các nút, nhưng điều này dường như không hoạt động.

Câu trả lời:


230

Badr,

Bạn cần đặt android:keycho mục, Sau đó, trong mã của bạn, bạn có thể thực hiện ...

Giả sử bạn sử dụng phần sau trong XML của mình:

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

Sau đó, bạn có thể làm như sau trong mã của mình:

Preference myPref = (Preference) findPreference("myKey");
myPref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
             public boolean onPreferenceClick(Preference preference) {
                 //open browser or intent here
                 return true;
             }
         });

3
Tôi sẽ đặt cái này ở đâu? trong Cài đặt của tôi Hoạt động trong onPostCreatekhông hoạt động vì còn quá sớm (Nullpointer-Exception). Any help is appreciated
Wandang

1
findPreferencekhông được dùng nữa.
zackygaurav

6
PreferenceActivity.findPreferencekhông được dùng nữa. Tuy nhiên, tài liệu cho biết "[T] chức năng của anh ấy giờ sẽ được tìm thấy trong lớp PreferenceFragment mới. Nếu bạn đang sử dụng PreferenceActivity ở chế độ cũ, thì tài liệu ở đó áp dụng cho các API không dùng nữa ở đây.", Và PreferenceFragment.findPreferencekhông còn được dùng nữa (đối với API cấp 23, hiện tại tại thời điểm viết bài). Vì vậy, findPreferencebản thân nó không bị phản đối; nó là cách sử dụng trực tiếp PreferenceActivitykhông được dùng nữa. Google muốn chúng tôi chuyển đến PreferenceFragmentthay vì từ bỏ findPreference.
Mike Playle

Trong onPreferenceClick, trả lại truenếu nhấp chuột đã được xử lý khác false.
Thupten

Điều này phù hợp với tôi với PreferenceFragmentCompatDividers.
Joseph Lam

59

để khởi chạy một trang web:

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

để khởi chạy một hoạt động cụ thể:

<PreferenceScreen android:title="something">
    <intent
        android:action="android.intent.action.MAIN"
        android:targetPackage="com.example.foo"
        android:targetClass="com.example.foo.SomeActivity"
        />
</PreferenceScreen>

bạn cũng có thể sử dụng "android: mimetype" để đặt mimetype.


1
Tôi đồng ý, cách tiếp cận này tốt hơn, đặc biệt là vì nó không sử dụng phương thức findPreference (khóa chuỗi) hiện không được dùng nữa và vì nó chỉ rõ ràng hơn về tổng thể.
lyallcooper

Rất hay, nhưng liệu có thể tạo IntentChooser theo cách này không?
Peterdk

@jasongilbert Có thể gửi chương trình phát sóng với ACTION thay vì bắt đầu hoạt động từ nhấp chuột tùy chọn không?
Sazzad Hissain Khan,

1
@jasongilbert Tôi có nên chỉ định bất kỳ điều nào intent-filtertrong tệp kê khai cho SomeActivity, vì tôi đang nhận được không ActivityNotFoundException:(
theapache64

11

Bạn cần sử dụng sự kiện onPreferenceTreeClick.

Ví dụ: xem 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; 
        } 
    } 

Liên kết là 404
JZAU

6

2018+ CẬP NHẬT Hôm nay, findPreferencephương pháp được mô tả. Vì vậy, để đạt được điều này, chỉ cần ghi đè onPreferenceTreeClickphương thức trong phân đoạn Sở thích của bạn. Ví dụ:

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

Hơn nữa, nếu bạn cần xử lý một nhấp chuột bên trong phần tử tùy chọn cụ thể (ví dụ ListPreference), bạn nên đăng ký setOnPreferenceChangeListenerbên trong onCreatephương thức của 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;
        }
    });
}

Sự khác biệt giữa onPreferenceClickvà là onPreferenceTreeClick gì?
Yousha Aleayoub

3

Tiếp theo về câu trả lời của @jason gilbert

Tôi đang sử dụng targetSdkVersion 25 và câu trả lời của anh ấy không hoạt động, tôi phải bọc thẻ ý định bằng thẻ Tùy chọn. Thí dụ:

<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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.