首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PreferenceFragment NullPointerException

PreferenceFragment NullPointerException
EN

Stack Overflow用户
提问于 2015-05-16 19:22:54
回答 4查看 5.6K关注 0票数 0
代码语言:javascript
复制
public class MyPrefs extends PreferenceActivity {

    public static class MyPreferenceFragment extends PreferenceFragment
    {
        @Override
        public void onCreate(final Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.preferences);
        }
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        MyPreferenceFragment frag =  new MyPreferenceFragment();

        getFragmentManager().beginTransaction().replace(android.R.id.content, frag).commit();

        Preference pref;
        pref = frag.findPreference("pref_gps_updates");

        pref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                return true;
            }
        });

    }
}

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.preference.Preference.setOnPreferenceChangeListener(android.preference.Preference$OnPreferenceChangeListener)' on a null object reference

我不明白为什么我会撞车,或者我做错了什么?

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >

    <EditTextPreference
        android:key="pref_gps_updates"
        android:inputType="number"
        android:title="@string/pref_gps_updates"
        android:summary="@string/pref_gps_updates_summary"
        android:defaultValue="60" />

</PreferenceScreen>    
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-05-16 19:30:37

代码语言:javascript
复制
Preference pref;
pref = frag.findPreference("pref_updates");

pref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        return true;
    }
});

将此部分放入您的片段‘s onCreate() (活动onCreate中的NOT)中,并再次检查在xml中是否使用了密钥pref_updates

更新:

代码语言:javascript
复制
public class MyPrefs extends PreferenceActivity {

    public static class MyPreferenceFragment extends PreferenceFragment
    {
        @Override
        public void onCreate(final Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.preferences);


            Preference pref;
            pref = findPreference("pref_gps_updates");

            pref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
                @Override
                public boolean onPreferenceChange(Preference preference, Object newValue) {
                    return true;
                }
            });
        }
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        MyPreferenceFragment frag =  new MyPreferenceFragment();

        getFragmentManager().beginTransaction().replace(android.R.id.content, frag).commit();

    }
}
票数 5
EN

Stack Overflow用户

发布于 2015-05-16 20:01:05

与其为每个首选项创建一个PreferenceChangedListener,不如让PreferenceFragment实现OnSharedPreferenceChangeListener接口。

这样,无论您添加了多少首选项,您都不需要为每个首选项添加一个新的侦听器,并且逻辑是自包含在PreferenceFragment中的。

会是这样的:

代码语言:javascript
复制
public class MyPrefs extends PreferenceActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        MyPreferenceFragment frag = new MyPreferenceFragment();

        getFragmentManager().beginTransaction().replace(android.R.id.content, frag).commit();

        /* remove all of this
        Preference pref;
        pref = frag.findPreference("pref_gps_updates");
        pref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                return true;
            }
        });
        */

    }


    public static class MyPreferenceFragment extends PreferenceFragment
            implements OnSharedPreferenceChangeListener {
        @Override
        public void onCreate(final Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.preferences);
        }

        @Override
        public void onResume() {
            super.onResume();
            getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
        }

        @Override
        public void onPause() {
            super.onPause();
            getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
        }

        @Override
        public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {

            if (key.equals("pref_gps_updates")) {
                //do something
            }
        }
    }
}
票数 2
EN

Stack Overflow用户

发布于 2015-05-16 19:32:06

在您使用的代码中

代码语言:javascript
复制
pref = frag.findPreference("pref_updates");

但是在xml中,它说

代码语言:javascript
复制
android:key="pref_gps_updates"

更改键需要匹配才能找到。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30279824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档