NullPointerException доступ к деятельности из PreferenceFragment - PullRequest
0 голосов
/ 24 ноября 2018

Редактировать: изменение языка приводит к тому, что SettingsActivity.onCreate вызывается дважды: (1) из-за пересоздания () и (2) из-за изменения контекста.Однако SettingsFragment.onCreate вызывается только один раз, что объясняет вопрос ниже.Но почему не вызывается SettingsFragment.onCreate после второго выполнения SettingsActivity.onCreate?


Я новичок в разработке под Android и хочу понять причину, которая приводит к сбою приложения:

В рамках действия настройки я поместил PreferenceFragment, который позволяет пользователю изменять язык интерфейса пользователя.Чтобы получить эффект и не испортить задний стек, я вызываю метод refreshate () активности фрагмента.Первая реализация выглядела следующим образом:

(A)

public class SettingsActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SettingsFragment fragment = new SettingsFragment();
        getFragmentManager().beginTransaction().replace(android.R.id.content, fragment).commit();
        getFragmentManager().executePendingTransactions();
        fragment.setActivity(this);
    }


    public static class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener
    {

        Activity m_activity;

        public void setActivity(Activity activity){
            m_activity = activity;
        }

        @Override
        public void onCreate(final Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.preferences);
            SharedPreferences preferences = getPreferenceScreen().getSharedPreferences();
            preferences.registerOnSharedPreferenceChangeListener(this);
        }


        @Override
        public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
                ...
                m_activity.recreate();
        }
    }
}

Иногда вышеуказанное решение работает, иногда m_activity имеет значение Null и приложение зависает.В качестве возможного альтернативного решения я удалил сеттер setActivity и вызвал getActivity в onSharedPreferenceChanged:

(B)

 @Override
 public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
                ...
                getActivity().recreate();
  }

Но это также приводит к случайным исключениям NullPointerExceptions.

В сценарии (B) я обнаружил, что onAttach фрагмента иногда не вызывается по какой-либо причине и, следовательно, getActivity возвращает ноль.Однако я ожидал бы, что сценарий (A) не завершится сбоем, поскольку этот не равен Null в onCreate?

1 Ответ

0 голосов
/ 25 ноября 2018

Проблема решена!

Для тех, у кого такая же проблема: мне пришлось отменить регистрацию прослушивателя onSharedPreferenceChanged в SettingsFragment.onDestroy.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...