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的主要内容,如果未能解决你的问题,请参考以下文章