PreferenceFragment.findPreference 总是返回 NULL。

11

我目前正在尝试制作一个设置菜单,其中将显示MultiSelectListPreference,以从联系人列表中选择多个联系人。

此时,当我尝试使用MultiSelectListPreference#setEntryValue(CharSequence[])时,我收到一个NullPointerException。如果我先放置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中创建了一个测试preference,并使用findPreference将其转换为对象以进行操作-> 返回NULL。 - 我已将我的MultiSelectListPreference键设置为@string/test,并将其放入strings.xml中,但findPreference仍然返回Null。

我的PreferenceFragment可能有问题吗?


你确定 findPreference("contactList") 返回的是真实值,而不是 null 吗? - Archer
没想到那个。该死。它确实返回 Null。我看错了东西。谢谢! - Wesley De Keirsmaeker
有人知道为什么它找不到我的偏好设置吗?键是正确的,我以我所知道的方式正确地调用了它。它在我的Fragment中。也许它正在错误的位置搜索我的偏好设置? - Wesley De Keirsmaeker
对我来说这是个愚蠢的错误。我只添加了titlePreferenceCategory而没有添加key:-(,确保你也添加了keyandroid:key="pre_item_key" 并通过key进行查找。 - Hossain Khan
4个回答

27

好的,我找到了我的问题所在。

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

返回NULL,因为

addPreferencesFromResource(R.xml.preferences);

在开始时还没有完成...因此它还没有加载我的首选项。


6
您可以使用下列方法解决这个问题:
getFragmentManager().executePendingTransactions();

之前

findPreference(section);

1
在我的情况下,我试图在封装的PreferenceActivity的onCreate中使用findPreferences。我将其移到PreferenceFragment的onCreate中,它可以正常工作。

0
你可以通过将所有内容访问函数放置在以下片段回调中来解决这个问题。
@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    //Access the content here.
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接