За то время, что я потратил на изучение Android Development, я понял, что использование "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
, а также где, когда и как использовать onAttach()
(поскольку в настоящее время все работает довольно хорошо, но мне сказали, что оно мне нужно).