PreferenceFragment.findPreference总是返回NULL(Preferen

2019-07-18 06:09发布

目前,我想要做一个设置菜单,即会显示一个MultiSelectListPreference ,选择从您的联系人列表中的多个联系人。

在这一刻,我收到一个NullPointerException ,当我尝试MultiSelectListPreference#setEntryValue(CharSequence[])如果我把setEntries第一,一个抛出同样的异常。

我已经把一个断点,走一步看一步会发生什么。 这些变量填充,因为它们存储Strings ,它们可以包含String “空”,所以我想,如果没有它不会失败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();
        }
    }
}

编辑:好吧,我做了一对夫妇更多的检查。 -I在我的XML做了一个试验偏好和使用的findPrefence使对象的它一起工作 - >返回NULL -I已设置我的我的MultiSelectListPreference为@ string /测试的关键,在我的strings.xml,findpreference这个推杆还是返回null。

哪有我PreferenceFragment一个问题吗?

Answer 1:

好吧,我发现我的问题是什么。

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

返回NULL,因为

addPreferencesFromResource(R.xml.preferences);

在一开始不这样做...所以它没有加载在还我的喜好。



Answer 2:

你可以解决这个使用

getFragmentManager().executePendingTransactions();

之前

findPreference(section);


Answer 3:

就我而言,我试图在封闭PreferenceActivity的的onCreate使用findPreferences。 我把它倒在PreferenceFragment的的onCreate并能正常工作。



文章来源: PreferenceFragment.findPreference always returns NULL