从PreferenceFragment访问活动时出现NullPointerException



编辑:更改语言会导致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();
}

但这也会导致偶发的NullPointerException。

在场景(B(中,我发现有时由于任何原因都没有调用片段的"onAttach",因此"getActivity"返回null。然而,我希望场景(A(不会崩溃,因为这个在onCreate中不是Null?

问题解决了

对于那些有同样问题的人:我不得不在SettingsFragment.onDestroy.中注销onSharedPreferenceChanged侦听器

相关内容

最新更新