【发布时间】:2019-02-14 07:46:11
【问题描述】:
在我学习 Android 开发的过程中,我意识到“上下文”的使用是我们所做的几乎所有事情的共同主题。
我最近阅读了以下文章,以及所有参考文献:What is it about Context?
除了这是关于上下文的信息资源之外,我还有一个额外的问题,基于它所说的......
它说(我引用):(6) When in fragment, assign a context to the one from onAttach(Context context) method
问题(1):我目前正在尝试使用 Preferencec-API 从 PreferenceFragment..就Context 而言,我应该如何处理?
注意:我是在onPreferenceChangedListener 内部执行此操作的。
问题(2): 是否有一个简单的答案,或者我必须按照我在链接中提供的报价中的说明进行操作?如果是这样,我该怎么做呢,因为我的 PreferenceFragment 没有任何 onAttach 方法?
除了将extends PreferenceFragment 更改为PreferenceFragmentCompat,我知道我还必须在我的代码中实现onAttach(Context context)。
Q #1 -更改为PreferenceFragmentCompat 是否需要任何其他相应的更改?
Q #2 - 我知道我必须将 onAttach 添加到我的代码中 - 这会先于添加到 onCreate, 还是 >?
Q #3 -我必须将我的所有代码从onCreate 迁移到onAttach 吗? ..或者它的目的是什么?
最终,我需要知道我做错了什么,以及如何轻松地纠正它。
请记住,我对许多 Android 开发概念仍然很陌生 - 但我米学习。
import ...
/* SUPPOSED to CHANGE TO 'PreferenceFragmentCompat' (?) */
public class SettingsFragment extends PreferenceFragment {
// THIS IS A TOGGLE PREFERENCE
public static final String PREF_GPS_STATE_LISTENER = "pref_gpsStateListener";
// THIS IS A LIST-PREFERENCE
public static final String PREF_NOTIFICATION_MODE = "pref_notificationMode";
// I STILL NEED TO IMPLEMENT THESE PREFERENCE CHANGES LATER (DISREGARD)
public static final String NOTIFICATION_MODE_A = "Mode A";
public static final String NOTIFICATION_MODE_B = "Mode B";
// THIS IS A LIST-PREFERENCE
public static final String PREF_NOTIFICATION_TYPE = "pref_notificationType";
// I STILL NEED TO IMPLEMENT THESE PREFERENCE CHANGES LATER (DISREGARD)
public static final String NOTIFICATION_TYPE_SOUND = "Sound";
public static final String NOTIFICATION_TYPE_VIBRATION = "Vibration";
private SharedPreferences.OnSharedPreferenceChangeListener prefChangeListener;
/*
/ IS THIS WHERE I'M SUPPOSED TO IMPLEMENT 'onAttach(Context context)' (?)
/ AND IF SO, WHAT CHANGES TO MY CURRENT CODE MUST I MAKE.. (?)
*/
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
prefChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged
(SharedPreferences sharedPreferences, String key) {
if (key.equals(PREF_GPS_STATE_LISTENER)) {
// FIRE METHOD BELOW TO ENABLE/DISABLE A LISTENER OPTION IN PREFERENCES
gpsListenerChangedMethod();
}
if (key.equals(PREF_NOTIFICATION_MODE)) {
Preference notifModePref = findPreference(key);
notifModePref.setSummary(sharedPreferences.getString(key, ""));
// FIRE METHOD BELOW TO HANDLE [SOME] OF THE CHANGES TO THIS PREFERENCE
notifModeChangedMethod();
}
if (key.equals(PREF_NOTIFICATION_TYPE)) {
Preference notifTypePref = findPreference(key);
notifTypePref.setSummary(sharedPreferences.getString(key, ""));
// FIRE METHOD BELOW TO HANDLE [SOME] OF THE CHANGES TO THIS PREFERENCE
notifTypeChangedMethod();
}
}
};
} // END of [onCreate]
public void gpsListenerChangedMethod() {
final PackageManager pacMan =
getActivity().getApplicationContext().getPackageManager();
final ComponentName comp_LocationReceiver = new ComponentName
("com.studio2bdesigns.gpskillerproalpha122018",".LocationReceiver");
final SharedPreferences getPrefs =
PreferenceManager.getDefaultSharedPreferences(getActivity());
if (getPrefs.getBoolean(PREF_GPS_STATE_LISTENER, true)) {
pacMan.setComponentEnabledSetting(comp_LocationReceiver,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
Log.i(TAG, "PREF_GPS_STATE_LISTENER is 'TRUE' - Enabling Receiver.");
} else if (!getPrefs.getBoolean(PREF_GPS_STATE_LISTENER, true)) {
pacMan.setComponentEnabledSetting(comp_LocationReceiver,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
Log.i(TAG, "PREF_GPS_STATE_LISTENER is 'FALSE' - Disabling Receiver.");
}
}
public void notifModeChangedMethod() {
Log.i(TAG, "Firing METHOD [notifModeChangedMethod]");
// Finish NOTIFICATION_MODE changes here, elsewhere, etc
}
public void notifTypeChangedMethod() {
Log.i(TAG, "Firing METHOD [notifTypeChangedMethod]");
// Finish NOTIFICATION_TYPE changes here, elsewhere, etc
}
@Override
public void onResume() {
super.onResume();
getPreferenceScreen().getSharedPreferences()
.registerOnSharedPreferenceChangeListener(prefChangeListener);
Preference notifModePref = findPreference(PREF_NOTIFICATION_MODE);
notifModePref.setSummary(getPreferenceScreen().getSharedPreferences()
.getString(PREF_NOTIFICATION_MODE, ""));
Preference notifTypePref = findPreference(PREF_NOTIFICATION_TYPE);
notifTypePref.setSummary(getPreferenceScreen().getSharedPreferences()
.getString(PREF_NOTIFICATION_TYPE, ""));
}
@Override
public void onPause() {
super.onPause();
getPreferenceScreen().getSharedPreferences()
.unregisterOnSharedPreferenceChangeListener(prefChangeListener);
}
// This METHOD was referenced in the Link I provided in my original post, as a way to retrieve Context from within a Fragment (such as PreferenceFragment I assume).. I'm unsure of how to go about implementing this.
@Override
public void onAttach (Context context) {
super.onAttach(context);
// UNSURE OF HOW TO IMPLEMENT THIS METHOD.
}
}
// END of CLASS [SettingsFragment]
}
因此,我的帖子已在上面进行了编辑,以包含我当前的 PreferenceFragment 代码,以及与将其更改为 PreferenceFragmentCompat 相关的问题,以及在何处、何时以及如何使用 @ 987654339@(目前看来一切运作良好,但有人告诉我我需要它)。
【问题讨论】:
-
PreferenceFragment已弃用,必须改为迁移到PreferenceFragmentCompat。所有 Fragment 子类都包含onAttach()。 -
哦,认真的吗?好的,所以我需要将
public class SettingsFragment extends PreferenceFragment改为PreferenceFragmentCompat吗?然后,我是否需要调整其余代码中的任何内容,目前在onCreate' (which contains the onPreferenceChangedListener、onPause和onResume.. SO IN OTHER WORDS: 如何在我的情况下,onAttach()会起作用吗?并提前感谢您。 -
我无法给出答案,因为我不完全确定您的代码是做什么的。如果您能提供您当前的代码以及问题,那就太好了。
-
由于 PreferenceFragmentCompat 处理 SharedPreferences 它已经拥有对必要上下文的引用,这很可能是 Activity 的上下文,因此您无需担心检索/使用除您的上下文之外的任何其他上下文已经有。 PreferenceFragmentCompat 不拥有
onAttach(),所以你不可能实现它!老实说,关于 PreferenceFragmentCompat 的目的,看不出你需要它的原因,onCreate()似乎足以满足你在那里可能需要做的所有事情 -
@Enzokie 按照您的要求,我已将完整的代码示例以及我的担忧添加到我的初始帖子中。感谢您提醒我添加它。
标签: android android-fragments android-activity android-fragmentactivity android-context