NullPointerException从PreferenceFragment访问活动

时间:2018-11-24 09:38:33

标签: android android-fragments preferencefragment

编辑:更改语言会导致两次调用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?

1 个答案:

答案 0 :(得分:0)

问题已解决!

对于那些有相同问题的人:我必须在SettingsFragment.onDestroy中注销onSharedPreferenceChanged侦听器。