답변:
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;
}
});
findPreference
더 이상 사용되지 않습니다.
PreferenceActivity.findPreference
더 이상 사용되지 않습니다. 그러나 문서에는 "[T] 이제 새로운 PreferenceFragment 클래스에서 해당 기능을 찾을 수 있어야합니다. 이전 모드에서 PreferenceActivity를 사용하는 경우 해당 문서가 여기에서 사용되지 않는 API에 적용됩니다."라고되어 있으며 PreferenceFragment.findPreference
사용되지 않습니다 (API 기준). 레벨 23, 작성 당시 현재). 따라서 findPreference
그 자체는 더 이상 사용되지 않습니다. PreferenceActivity
더 이상 사용되지 않는 직접 사용입니다 . Google은 우리 PreferenceFragment
가 포기 하는 것이 아니라 로 이동하기 를 원합니다 findPreference
.
onPreferenceClick
반환, true
클릭은 다른 처리 된 경우 false
.
웹 사이트를 시작하려면 :
<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을 설정할 수도 있습니다 .
intent-filter
매니페스트에 어떤 것을 지정해야하는지 SomeActivity
, cuz am getting ActivityNotFoundException
:(
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;
}
}
2018+ UPDATE
오늘,이 findPreference
메서드는 더 이상 사용되지 않습니다. 따라서이를 달성하려면 onPreferenceTreeClick
Preference 조각에서 메서드를 재정의하면 됩니다. 예를 들면 :
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
?
@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>
onPostCreate
너무 이르기 때문에 내 SettingsActivity에서 작동하지 않습니다 (Nullpointer-Exception). 도움을 주시면 감사하겠습니다