Редактировать: изменение языка приводит к тому, что 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?