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

我不明白为什么会发生此崩溃或我做错了什么?

<?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>    

===============>>#1 票数:5 已采纳

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

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

将这个部分到您的片段onCreate()不是在活动的onCreate),并仔细检查,如果该键pref_updates在您使用xml

更新:

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();

    }
}

===============>>#2 票数:2

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

这样,无论您添加了多少首选项,都无需为每个首选项添加一个新的侦听器,并且该逻辑独立于PreferenceFragment

就像这样:

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
            }
        }
    }
}

===============>>#3 票数:1

在代码中使用

pref = frag.findPreference("pref_updates");

但是在xml中说

android:key="pref_gps_updates"

更改密钥需要匹配才能找到。

===============>>#4 票数:0

在执行片段事务之前,请尝试向上移动代码。

    MyPreferenceFragment frag =  new MyPreferenceFragment();

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

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

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

}

}

  ask by Gert Cuykens translate from so

未解决问题?本站智能推荐:

3回复

PreferenceFragment:NullPointerException

我做了一个PreferenceActivity来控制我的应用程序的设置。 每次单击首选项时,应用程序崩溃并创建NullPointerException错误。 这是PreferenceFragment: 这是logcat: 我已经尽力解决了这个问题。 我怀疑应该归咎于背景
1回复

NullPointerException从PreferenceFragment访问活动

编辑:更改语言会导致SettingsActivity.onCreate被调用两次:(1)由于recreate()和(2)由于上下文更改。 但是SettingsFragment.onCreate仅被调用一次,下面的问题对此种解释。 但是,为什么在第二次执行SettingsActivity.on
1回复

PreferenceFragment getListView

(谷歌翻译)我有一个带有图标和ImageView的自定义PreferenceFragment。 此屏幕控制我的应用程序的通知。 通过单击“项目”,可以在单击ImageView(soundIcon)时禁用或启用通知,从而不断更改通知的类型(振动,声音)。 但是,当我单击ImageView(s
2回复

使用CollapsingToolbarLayout的PreferenceFragment

我想要像电报应用程序一样使用滚动活动的首选项片段。 我在FrameLayout使用了android.support.v7.widget.RecyclerView ,这是我的活动xml: 这是我的活动课: 问题是当我滚动android.support.v7.widget.Rec
1回复

PreferenceFragment与支持库

我正在开发一个应用程序,我一直在使用支持库片段,我偶然发现了这个问题,我似乎无法使用这个库添加PreferencesFragment (用于设置)? 我发现了一些使用v7 PreferenceFragmentCompat建议,但是由于某些原因,我无法将v7支持库添加到我的构建路径,因此我无
1回复

PreferenceFragment布局值

我正在创建一个带有主菜单的应用程序,这些菜单项之一将打开一个PreferenceFragment。 为了在应用程序内创建统一性,我希望主菜单看起来尽可能靠近PreferenceFragment。 基本上,我可以用来创建与PreferenceFragment中的菜单项相似的所有菜单项的xml值
1回复

旧设备中的PreferenceFragment?

我需要创建一个设置屏幕 ,其中只有前半部分包含首选项。 我在考虑包含PreferenceFragment ,但我需要支持旧设备 (支持的最低API级别为9),我还需要显示操作栏(目前使用的是appcompat库)。 根据这个问题,我搞砸了。 所以现在我需要复制首选项列表的外观。
1回复

PreferenceFragment支持所有API问题

这是首次使用偏好片段与偏好活动,因此取决于此帖子的接受答案: PreferenceActivity Android 4.0及更早版本 我应用下面的代码sa并在姜饼运行设备上测试它,它的工作正常但是当在果冻豆运行设备app力直接关闭测试时,我知道我的代码有些问题或者我想念一些东西, 所
1回复

Android SharedPreferences / PreferenceFragment无效

我最近研究了有关使用共享首选项处理应用程序首选项以及Android Developer Documentation中的PreferenceFragment ,并做了以下简单示例: SettingsActivity.java SettingsFragment.java RES
2回复

PreferenceFragment的getHeight()

我在ScrollView有多个FrameLayout 。 在其中一个FrameLayout我正在加载PreferenceFragment 。 现在,我需要将FrameLayout的高度设置为PreferenceFragment的高度,以避免嵌套滚动( PrefrenceFragment也可以