11

我目前正在尝试制作一个设置菜单,该菜单将显示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();
        }
    }
}

编辑:好的,我又做了几项检查。-我在我的 XML 中做了一个测试首选项,并使用 findPrefence 来制作它的对象 -> 返回 NULL -我已将 MultiSelectListPreference 的键设置为 @string/test,将其放入我的 strings.xml,findpreference仍然返回 Null。

我的 PreferenceFragment 有问题吗?

4

4 回答 4

26

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

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

返回 NULL 因为

addPreferencesFromResource(R.xml.preferences);

一开始还没有完成......所以它还没有加载我的偏好。

于 2013-01-16T12:31:41.973 回答
6

您可以使用解决此问题

getFragmentManager().executePendingTransactions();

findPreference(section);
于 2014-10-31T09:23:15.310 回答
1

就我而言,我试图在封闭的 PreferenceActivity 的 onCreate 中使用 findPreferences。我将它移到 PreferenceFragment 的 onCreate 上,它工作正常。

于 2017-10-05T18:01:43.727 回答
0

您可以通过将所有内容访问函数放在以下片段回调中来解决此问题

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    //Access the content here.
}
于 2019-12-01T11:35:58.617 回答