调用这个的代码位于Preference#performClick(PreferenceScreen preferenceScreen) https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/preference/Preference.java它执行以下操作:
PreferenceManager preferenceManager = getPreferenceManager();
if (preferenceManager != null) {
PreferenceManager.OnPreferenceTreeClickListener listener = preferenceManager
.getOnPreferenceTreeClickListener();
if (preferenceScreen != null && listener != null
&& listener.onPreferenceTreeClick(preferenceScreen, this)) {
return;
}
}
if (mIntent != null) {
Context context = getContext();
context.startActivity(mIntent);
}
返回true
返回时会立即返回false
将检查是否有Intent
为此设置PreferenceScreen
and 启动指定的Activity https://stackoverflow.com/questions/7275015/android-start-activity-from-preferences-xml.
If you return super.onPreferenceTreeClick(preferenceScreen, preference)
您还将导致以下代码片段PreferenceFragment https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/preference/PreferenceFragment.java to run
if (preference.getFragment() != null &&
getActivity() instanceof OnPreferenceStartFragmentCallback) {
return ((OnPreferenceStartFragmentCallback)getActivity()).onPreferenceStartFragment(
this, preference);
}
return false;
这个检查是否有Fragment待展示 http://developer.android.com/reference/android/preference/Preference.html#attr_android:fragment。如果不Preference
然后会寻找一个Intent
.
TLDR
首选项可以启动Intent
s or Fragment
是。返回值的含义是
-
true
:什么也没发生,片段和意图都被忽略
-
false
:片段被忽略,意图被执行
-
super.onPreference..
:首先尝试片段,其次尝试意图
return false;
or return super.onPreferenceTreeClick(...)
通常应该是正确的返回方式。返回值的含义大致是“如果存在的话,按意图启动Activity?”。你应该回来true
如果您已指定意图但不想启动该活动。在大多数其他情况下这并不重要,因为如果您指定了该意图,则很少处理点击。