编辑:更改语言会导致两次调用SettingsActivity.onCreate:(1)由于recreate()和(2)由于上下文更改。 但是SettingsFragment.onCreate仅被调用一次,下面的问题对此种解释。但是为什么在第二次执行SettingsActivity.onCreate之后不调用SettingsFragment.onCreate?
我刚开始开发Android,想了解导致我的应用程序崩溃的原因:
在设置活动中,我放置了一个PreferenceFragment,它允许用户更改UI语言。为了使效果不破坏后台堆栈,我调用了片段活动的recreate()方法。 第一个实现如下所示:
(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”设置器,并在onSharedPreferenceChanged中将其称为“ getActivity”:
(B)
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
...
getActivity().recreate();
}
但这也会导致偶发的NullPointerExceptions。
在场景(B)中,我发现有时出于某种原因未调用该片段的“ onAttach”,因此“ getActivity”返回null。但是我希望方案(A)不会崩溃,因为 this 在onCreate中不是Null?
答案 0 :(得分:0)
问题已解决!
对于那些有相同问题的人:我必须在SettingsFragment.onDestroy中注销onSharedPreferenceChanged侦听器。