Примеры использования контекста в разработке Android (фрагмент и т. Д.) - PullRequest
0 голосов
/ 14 февраля 2019

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

1 Ответ

0 голосов
/ 14 февраля 2019

Чтобы инициализировать предпочтения (или любой другой сервер в этом отношении), вы можете предоставить сервису любой контекст, будь то ваш фрагмент, действие или контекст вашего приложения, вы даже можете задать контекст View с помощью View.getContext()!поскольку все они разрешаются в контексте вашего приложения, в котором нуждаются настройки / другие API.

Стоит отметить, что вы должны заботиться о том, «когда» вы получаете контекст.Например, если ваш фрагмент отсоединен, у него нет контекста, и поэтому он вернет вам null.Лучшее место было бы onViewCreated или onAttached.

. Правила, приведенные в ссылке, являются «хорошими» с точки зрения следующих рекомендаций, но они не полны (и полный набор не предоставляется Google, к несчастью).№ 5 является наиболее важным, то есть вы не должны сохранять статические ссылки на ваш контекст (или представления, фрагменты, действия) из-за проблем утечки памяти.

Чтобы добавить предпочтение прослушивателю, изменившему прослушиватель, вам необходимо зарегистрироватьсяв onResume и отмените регистрацию в onPaused, как показано ниже:

@Override
public void onResume() {
    super.onResume();
    getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);

}

@Override
public void onPause() {
    getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
    super.onPause();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...