Android 환경 설정 onclick 이벤트


111

내 preferences.xml에는 다음과 같은 환경 설정 요소가 있습니다.

<Preference android:title="About" />

onClick이벤트 를 할당하고 싶기 때문에 사용자가 클릭하면 새 Intent브라우저 나 브라우저를 열 수 있습니다 . 버튼을 사용하는 것처럼 시도했지만 작동하지 않는 것 같습니다.

답변:


230

Badr,

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
이거 어디에 둘까요? onPostCreate너무 이르기 때문에 내 SettingsActivity에서 작동하지 않습니다 (Nullpointer-Exception). 도움을 주시면 감사하겠습니다
Wandang

1
findPreference더 이상 사용되지 않습니다.
zackygaurav

6
PreferenceActivity.findPreference더 이상 사용되지 않습니다. 그러나 문서에는 "[T] 이제 새로운 PreferenceFragment 클래스에서 해당 기능을 찾을 수 있어야합니다. 이전 모드에서 PreferenceActivity를 사용하는 경우 해당 문서가 여기에서 사용되지 않는 API에 적용됩니다."라고되어 있으며 PreferenceFragment.findPreference사용되지 않습니다 (API 기준). 레벨 23, 작성 당시 현재). 따라서 findPreference그 자체는 더 이상 사용되지 않습니다. PreferenceActivity더 이상 사용되지 않는 직접 사용입니다 . Google은 우리 PreferenceFragment가 포기 하는 것이 아니라 로 이동하기 를 원합니다 findPreference.
Mike Playle 2016 년

에서 onPreferenceClick반환, true클릭은 다른 처리 된 경우 false.
Thupten

이것은 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 (String key) 메서드를 사용하지 않고 전체적으로 더 깨끗하기 때문입니다.
lyallcooper 2013 년

아주 좋지만 이런 식으로 IntentChooser를 만드는 것도 가능합니까?
Peterdk

@jasongilbert 기본 설정 클릭에서 활동을 시작하는 대신 ACTION으로 브로드 캐스트를 보낼 수 있습니까?
Sazzad Hissain Khan 2015

1
@jasongilbert 내가 intent-filter매니페스트에 어떤 것을 지정해야하는지 SomeActivity, cuz am getting 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메서드는 더 이상 사용되지 않습니다. 따라서이를 달성하려면 onPreferenceTreeClickPreference 조각에서 메서드를 재정의하면 됩니다. 예를 들면 :

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등록해야 합니다 .setOnPreferenceChangeListeneronCreateMySettingsFragment

@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 에 있고 그의 대답이 작동하지 않았으므로 의도 태그를 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>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.