PreferenceFragment.findPreference всегда возвращает NULL

в настоящее время я пытаюсь сделать меню настроек, которое покажет MultiSelectListPreference, чтобы выбрать несколько контактов из списка контактов.

в данный момент я получаю NullPointerException, когда я пытаюсь MultiSelectListPreference#setEntryValue(CharSequence[]) Если я ставлю setEntries во-первых, это одно и то же исключение.

я поставил точку останова, чтобы увидеть шаг за шагом, что происходит. Переменные заполняются, потому что они хранят Strings, они могут содержать String "null", поэтому я думаю, что он не терпит неудачу, если нет Display_Name доступен и так.

Я основал findPreference на примере ответ

у кого какие идеи? Если вам нужна дополнительная информация, скажите мне. Спасибо за чтение!

package be.wdk.sendtowork;contactNumberArray

import android.database.Cursor;
import android.os.Bundle;
import android.preference.MultiSelectListPreference;
import android.preference.PreferenceFragment;
import android.provider.ContactsContract;
import android.util.Log;
import android.widget.Toast;

public class PreferenceClass extends PreferenceFragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Integer countContacts = 0;

        String[] projection = new String[]{
                ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
                ContactsContract.CommonDataKinds.Phone.NUMBER,
                ContactsContract.CommonDataKinds.Phone.PHOTO_URI
        };

        String selection = ContactsContract.CommonDataKinds.Phone.HAS_PHONE_NUMBER;
        String sortOrder = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME;
        try {
            Cursor c1 = getActivity().getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection, selection, null, sortOrder);
            c1.moveToFirst();
            Integer c1columncount = c1.getColumnCount();
            Integer c1count = c1.getCount();
            Toast toastje = Toast.makeText(getActivity(), c1columncount.toString() + " - " + c1count.toString(), Toast.LENGTH_SHORT);
            toastje.show();

            CharSequence[] contactNameArray = new CharSequence[c1count], contactNumberArray = new CharSequence[c1count];
            MultiSelectListPreference mslp = (MultiSelectListPreference) findPreference("contactList");
            do {
                contactNameArray[countContacts] = c1.getString(0) + " - " + c1.getString(2);
                contactNumberArray[countContacts] = c1.getString(1);
                countContacts += 1;
            } while(c1.moveToNext());

            mslp.setEntryValues(contactNumberArray); //<- line that throws the error
            mslp.setEntries(contactNameArray);
            addPreferencesFromResource(R.xml.preferences);
        } 
        catch (Exception e) {
            Log.v("TAG", " " + e.toString());
            e.getMessage();
        }
    }
}

EDIT: хорошо, я сделал еще пару проверок. -Я сделал предпочтение теста в моем XML и использовал findPrefence, чтобы сделать его объектом для работы с -> возвращает NULL - Я установил свой ключ моего MultiSelectListPreference в @string / test, поместил это в мой веревка.xml, findpreference по-прежнему возвращает Null.

может ли быть проблема с моим PreferenceFragment?

3 ответов


хорошо, я нашел, в чем моя проблема.

MultiSelectListPreference mslp = (MultiSelectListPreference) findPreference("contactList"); 

возвращает NULL, потому что

addPreferencesFromResource(R.xml.preferences);

не делается в начале... так что он еще не загрузил мои предпочтения.


вы можете решить эту проблему с помощью

getFragmentManager().executePendingTransactions();

до

findPreference(section);

в моем случае я пытался использовать findPreferences в onCreate заключительной PreferenceActivity. Я переместил его в onCreate PreferenceFragment, и он отлично работает.