moh*_*ndy 21 android multi-select preferenceactivity
我很难找到Android API中提供的MultiSelectListPreference的一个很好的例子.我看过很多对这个博客的引用,这就是我想要的最终结果,我不想为我想要实现的每个多选择首选项创建一个类.最后,我希望看到一个简单的多选对话框(我将动态填充值)的首选项xml,以及调用addPreferencesFromResource(R.xml.preferences);
目前,我有:
<MultiSelectListPreference
android:defaultValue=""
android:enabled="true"
android:entries="@array/pref_default_entries"
android:entryValues="@array/pref_default_values"
android:key="TargetList"
android:persistent="true"
android:summary="@string/TargetSummary"
android:title="@string/TargetTitle" />
Run Code Online (Sandbox Code Playgroud)
当我尝试在我的Activities onCreate调用中调用addPreferencesFromResource时,我收到以下错误:
06-18 13:59:30.690: E/AndroidRuntime(6052): FATAL EXCEPTION: main
06-18 13:59:30.690: E/AndroidRuntime(6052): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tracker/com.tracker.TrackerActivity}: android.view.InflateException: Binary XML file line #37: Error inflating class java.lang.reflect.Constructor
06-18 13:59:30.690: E/AndroidRuntime(6052): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1818)
06-18 13:59:30.690: E/AndroidRuntime(6052): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1834)
06-18 13:59:30.690: E/AndroidRuntime(6052): at android.app.ActivityThread.access$500(ActivityThread.java:122)
06-18 13:59:30.690: E/AndroidRuntime(6052): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1027)
06-18 13:59:30.690: E/AndroidRuntime(6052): at android.os.Handler.dispatchMessage(Handler.java:99)
06-18 13:59:30.690: E/AndroidRuntime(6052): at android.os.Looper.loop(Looper.java:132)
06-18 13:59:30.690: E/AndroidRuntime(6052): at android.app.ActivityThread.main(ActivityThread.java:4126)
06-18 13:59:30.690: E/AndroidRuntime(6052): at java.lang.reflect.Method.invokeNative(Native Method)
06-18 13:59:30.690: E/AndroidRuntime(6052): at java.lang.reflect.Method.invoke(Method.java:491)
06-18 13:59:30.690: E/AndroidRuntime(6052): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
06-18 13:59:30.690: E/AndroidRuntime(6052): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
06-18 13:59:30.690: E/AndroidRuntime(6052): at dalvik.system.NativeStart.main(Native Method)
06-18 13:59:30.690: E/AndroidRuntime(6052): Caused by: android.view.InflateException: Binary XML file line #37: Error inflating class java.lang.reflect.Constructor
06-18 13:59:30.690: E/AndroidRuntime(6052): at android.preference.GenericInflater.createItem(GenericInflater.java:397)
06-18 13:59:30.690: E/AndroidRuntime(6052): at android.preference.GenericInflater.onCreateItem(GenericInflater.java:417)
06-18 13:59:30.690: E/AndroidRuntime(6052): at android.preference.GenericInflater.createItemFromTag(GenericInflater.java:428)
06-18 13:59:30.690: E/AndroidRuntime(6052): at android.preference.GenericInflater.rInflate(GenericInflater.java:481)
06-18 13:59:30.690: E/AndroidRuntime(6052): at android.preference.GenericInflater.inflate(GenericInflater.java:326)
06-18 13:59:30.690: E/AndroidRuntime(6052): at android.preference.GenericInflater.inflate(GenericInflater.java:263)
06-18 13:59:30.690: E/AndroidRuntime(6052): at android.preference.PreferenceManager.inflateFromResource(PreferenceManager.java:269)
06-18 13:59:30.690: E/AndroidRuntime(6052): at android.preference.PreferenceActivity.addPreferencesFromResource(PreferenceActivity.java:1366)
06-18 13:59:30.690: E/AndroidRuntime(6052): at com.tracker.TrackerActivity.onCreate(TrackerActivity.java:30)
06-18 13:59:30.690: E/AndroidRuntime(6052): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1050)
06-18 13:59:30.690: E/AndroidRuntime(6052): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1782)
06-18 13:59:30.690: E/AndroidRuntime(6052): ... 11 more
06-18 13:59:30.690: E/AndroidRuntime(6052): Caused by: java.lang.reflect.InvocationTargetException
06-18 13:59:30.690: E/AndroidRuntime(6052): at java.lang.reflect.Constructor.constructNative(Native Method)
06-18 13:59:30.690: E/AndroidRuntime(6052): at java.lang.reflect.Constructor.newInstance(Constructor.java:416)
06-18 13:59:30.690: E/AndroidRuntime(6052): at android.preference.GenericInflater.createItem(GenericInflater.java:383)
06-18 13:59:30.690: E/AndroidRuntime(6052): ... 21 more
06-18 13:59:30.690: E/AndroidRuntime(6052): Caused by: java.lang.NullPointerException
06-18 13:59:30.690: E/AndroidRuntime(6052): at android.content.res.AssetManager.getResourceTextArray(AssetManager.java:215)
06-18 13:59:30.690: E/AndroidRuntime(6052): at android.content.res.Resources.getTextArray(Resources.java:435)
06-18 13:59:30.690: E/AndroidRuntime(6052): at android.content.res.TypedArray.getTextArray(TypedArray.java:628)
06-18 13:59:30.690: E/AndroidRuntime(6052): at android.preference.MultiSelectListPreference.onGetDefaultValue(MultiSelectListPreference.java:210)
06-18 13:59:30.690: E/AndroidRuntime(6052): at android.preference.Preference.<init>(Preference.java:257)
06-18 13:59:30.690: E/AndroidRuntime(6052): at android.preference.DialogPreference.<init>(DialogPreference.java:69)
06-18 13:59:30.690: E/AndroidRuntime(6052): at android.preference.DialogPreference.<init>(DialogPreference.java:90)
06-18 13:59:30.690: E/AndroidRuntime(6052): at android.preference.MultiSelectListPreference.<init>(MultiSelectListPreference.java:49)
06-18 13:59:30.690: E/AndroidRuntime(6052): ... 24 more
Run Code Online (Sandbox Code Playgroud)
我期待你的回复!
Sig*_*ist 46
您需要指定defaultValues属性
<MultiSelectListPreference
android:dialogTitle="@string/mode_repeat"
android:key="mode_repeat"
android:summary=""
android:title="@string/mode_repeat"
android:entries="@array/weekdays"
android:entryValues="@array/weekdays_values"
android:defaultValue="@array/empty_array"
/>
Run Code Online (Sandbox Code Playgroud)
如果您不想要默认值,请在strings.xml中创建一个空数组
<string-array name="empty_array"/>
Run Code Online (Sandbox Code Playgroud)
Tod*_*and 12
Sigrist是正确的,以解决您所看到的初始错误.它需要提供的默认值,即使它是空的.这对我有所帮助,我想在RUNTIME提供价值,但不要搞乱完整的实施.
请参阅此代码,了解我如何在运行时提供值,而无需处理完整实现.
public class CalendarListPreference extends MultiSelectListPreference {
ContentResolver cr;
Cursor cursor;
String[] projection = new String[] {CalendarContract.Calendars.NAME, CalendarContract.Calendars.CALENDAR_DISPLAY_NAME};
String selection = "(" + CalendarContract.Calendars.VISIBLE + " = ?)";
String[] selectionArgs = new String[] { "1" };
public CalendarListPreference(Context context, AttributeSet attrs) {
super(context, attrs);
List<CharSequence> entries = new ArrayList<CharSequence>();
List<CharSequence> entriesValues = new ArrayList<CharSequence>();
cr = context.getContentResolver();
cursor = cr.query(CalendarContract.Calendars.CONTENT_URI, projection, selection, selectionArgs, null);
while (cursor.moveToNext()) {
String name = cursor.getString(0);
String displayName = cursor.getString(1);
entries.add(name);
entriesValues.add(displayName);
}
setEntries(entries.toArray(new CharSequence[]{}));
setEntryValues(entriesValues.toArray(new CharSequence[]{}));
}
}
Run Code Online (Sandbox Code Playgroud)
在我的strings.xml中
<string-array name="pref_calendar_list_default">
</string-array>
Run Code Online (Sandbox Code Playgroud)
在我的preferences.xml中
<com.mynameistodd.autovolume.CalendarListPreference
android:defaultValue="@array/pref_calendar_list_default"
android:key="@string/pref_calendar_list_key"
android:summary="@string/pref_calendar_list_summary"
android:title="@string/pref_calendar_list_title"
android:dependency="@string/pref_calendar_enabled_key"/>
Run Code Online (Sandbox Code Playgroud)
我知道这是一个古老的问题,但它帮助了我,所以这是我的答案!
| 归档时间: |
|
| 查看次数: |
28026 次 |
| 最近记录: |