Gert Cuykens
Gert Cuykens

Reputation: 7155

PreferenceFragment NullPointerException

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

I don't understand why I get this crash or what I am doing wrong?

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

Upvotes: 0

Views: 5687

Answers (4)

Sebastian
Sebastian

Reputation: 318

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

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

Put this part into your Fragment's onCreate() (NOT in the activities onCreate) and double check if the key pref_updates is used in your xml.

Update:

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

    }
}

Upvotes: 5

Daniel Nugent
Daniel Nugent

Reputation: 43322

Instead of creating a PreferenceChangedListener for each preference, it would be better to just have your PreferenceFragment implement the OnSharedPreferenceChangeListener interface.

That way, no matter how many preferences you add, you won't need to add a new listener for each one, and the logic is self-contained in the PreferenceFragment.

It would be something like this:

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

Upvotes: 2

Andy Joyce
Andy Joyce

Reputation: 2832

Try and move the code up before you do the fragment transaction.

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

}

}

Upvotes: 0

adnan_e
adnan_e

Reputation: 1799

In code you use

pref = frag.findPreference("pref_updates");

but in xml it says

android:key="pref_gps_updates"

change keys need to match to be found.

Upvotes: 2

Related Questions