PreferenceFragment.findPreference 总是返回 NULL

Posted

技术标签:

【中文标题】PreferenceFragment.findPreference 总是返回 NULL【英文标题】:PreferenceFragment.findPreference always returns NULL 【发布时间】:2012-12-29 15:48:33 【问题描述】:

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

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

我已经设置了一个断点,以便逐步查看会发生什么。变量被填充是因为它们存储了Strings,它们可以包含一个String“null”,所以我猜如果没有Display_Name可用左右它不会失败。

我以this answer的例子为基础的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 可能有问题吗?

【问题讨论】:

您确定findPreference("contactList") 返回的是真实值,而不是null 没有想到这一点。该死的。它确实返回 Null。我看错东西了。谢谢! 有人知道为什么找不到我的偏好吗?关键是正确的,它以正确的方式调用(据我所知)。它在我的片段中。它可能是在错误的地方搜索我的偏好吗? 对我来说这是一个愚蠢的错误。我只在PreferenceCategory 中添加了title 而不是键:-(,请确保您还添加了键android:key="pre_item_key" 并按键查找。 【参考方案1】:

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

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

返回 NULL 因为

addPreferencesFromResource(R.xml.preferences);

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

【讨论】:

【参考方案2】:

你可以解决这个问题

getFragmentManager().executePendingTransactions();

之前

findPreference(section);

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

@Override
public void onActivityCreated(Bundle savedInstanceState) 
    super.onActivityCreated(savedInstanceState);
    //Access the content here.

【讨论】:

以上是关于PreferenceFragment.findPreference 总是返回 NULL的主要内容,如果未能解决你的问题,请参考以下文章