java - 为什么我的 PreferenceScreen 会强制关闭?

标签 java android preferences

我正在使我的偏好看起来更好一些。我正在使用 IconPreferenceScreen 为每个图标添加图标类,但是当我将所有 PreferenceScreens 更改为 IconPreferenceScreen 时,一些会给我一个强制关闭。

我展示的第一个偏好完美运行,但第二个强制关闭。

<PreferenceScreen 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:icon="http://schemas.android.com/apk/res/com.andrew.notifyme"
android:key="preference_screen"
android:title="@string/app_name_formatted">
<PreferenceCategory
    android:key="test_app_category"
    android:title="@string/test_text">
 <com.andrew.notifyme.preferences.IconPreferenceScreen
        android:key="test_app" 
        android:title="@string/test_text"
        icon:icon="@drawable/ic_test"
        android:dependency="app_enabled" >       
 </com.andrew.notifyme.preferences.IconPreferenceScreen>                                                                
 </PreferenceCategory>      

<PreferenceCategory
android:key="basic_settings_category"
android:title="@string/basic_settings_text">
<com.andrew.notifyme.preferences.IconPreferenceScreen
    android:key="basic_settings_screen" 
    android:title="Themes"
    icon:icon="@drawable/ic_test"
    android:dependency="app_enabled" >      
<PreferenceScreen
        android:key="quick_reply_settings_screen"
        android:title="@string/quick_reply_settings_text"
        android:dependency="app_enabled">
<CheckBoxPreference 
            android:key="quick_reply_save_draft_enabled" 
            android:title="@string/preference_save_draft_enabled_title" 
            android:summaryOn="@string/preference_save_draft_enabled_summaryOn" 
            android:summaryOff="@string/preference_save_draft_enabled_summaryOff" 
            android:defaultValue="true" />
</com.andrew.notifyme.preferences.IconPreferenceScreen>
</PreferenceScreen>
</PreferenceCategory>

堆栈跟踪:

08-04 01:06:50.697: ERROR/AndroidRuntime(9683): FATAL EXCEPTION: main
08-04 01:06:50.697: ERROR/AndroidRuntime(9683): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.andrew.notifyme/com.andrew.notifyme.preferences.MainPreferenceActivity}: java.lang.ClassCastException: com.andrew.notifyme.preferences.IconPreferenceScreen
08-04 01:06:50.697: ERROR/AndroidRuntime(9683):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1768)
08-04 01:06:50.697: ERROR/AndroidRuntime(9683):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784)
08-04 01:06:50.697: ERROR/AndroidRuntime(9683):     at android.app.ActivityThread.access$1500(ActivityThread.java:123)
08-04 01:06:50.697: ERROR/AndroidRuntime(9683):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939)
08-04 01:06:50.697: ERROR/AndroidRuntime(9683):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-04 01:06:50.697: ERROR/AndroidRuntime(9683):     at android.os.Looper.loop(Looper.java:130)
08-04 01:06:50.697: ERROR/AndroidRuntime(9683):     at android.app.ActivityThread.main(ActivityThread.java:3835)
08-04 01:06:50.697: ERROR/AndroidRuntime(9683):     at java.lang.reflect.Method.invokeNative(Native Method)
08-04 01:06:50.697: ERROR/AndroidRuntime(9683):     at java.lang.reflect.Method.invoke(Method.java:507)
08-04 01:06:50.697: ERROR/AndroidRuntime(9683):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
08-04 01:06:50.697: ERROR/AndroidRuntime(9683):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
08-04 01:06:50.697: ERROR/AndroidRuntime(9683):     at dalvik.system.NativeStart.main(Native Method)
08-04 01:06:50.697: ERROR/AndroidRuntime(9683): Caused by: java.lang.ClassCastException: apps.droidnotify.preferences.IconPreferenceScreen
08-04 01:06:50.697: ERROR/AndroidRuntime(9683):     at android.preference.GenericInflater.rInflate(GenericInflater.java:488)
08-04 01:06:50.697: ERROR/AndroidRuntime(9683):     at android.preference.GenericInflater.rInflate(GenericInflater.java:493)
08-04 01:06:50.697: ERROR/AndroidRuntime(9683):     at android.preference.GenericInflater.rInflate(GenericInflater.java:493)
08-04 01:06:50.697: ERROR/AndroidRuntime(9683):     at android.preference.GenericInflater.inflate(GenericInflater.java:326)
08-04 01:06:50.697: ERROR/AndroidRuntime(9683):     at android.preference.GenericInflater.inflate(GenericInflater.java:263)
08-04 01:06:50.697: ERROR/AndroidRuntime(9683):     at android.preference.PreferenceManager.inflateFromResource(PreferenceManager.java:251)
08-04 01:06:50.697: ERROR/AndroidRuntime(9683):     at android.preference.PreferenceActivity.addPreferencesFromResource(PreferenceActivity.java:262)
08-04 01:06:50.697: ERROR/AndroidRuntime(9683):     at com.andrew.notifyme.preferences.MainPreferenceActivity.onCreate(MainPreferenceActivity.java:103)
08-04 01:06:50.697: ERROR/AndroidRuntime(9683):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-04 01:06:50.697: ERROR/AndroidRuntime(9683):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722)
08-04 01:06:50.697: ERROR/AndroidRuntime(9683):     ... 11 more

抛出异常的代码:

public class MainPreferenceActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener {

//Google Market URL
private static final String RATE_APP_ANDROID_URL = "http://market.android.com/details?id=com.andrew.notifyme";
//Amazon Appstore URL
private static final String RATE_APP_AMAZON_URL = "http://www.amazon.com/gp/mas/dl/android?p=com.andrew.notifyme";

private static final String APP_ENABLED_KEY = "app_enabled";
private static final String CALENDAR_NOTIFICATIONS_ENABLED_KEY = "calendar_notifications_enabled";
private static final String LANDSCAPE_SCREEN_ENABLED_KEY = "landscape_screen_enabled";
private static final String CALENDAR_SELECTION_KEY = "calendar_selection";
private static final String CALENDAR_POLLING_FREQUENCY_KEY = "calendar_polling_frequency";

private static final int NOTIFICATION_TYPE_TEST = -1;

private boolean _debug = false;
private Context _context = null;
private boolean _debugCalendar = false;
private SharedPreferences _preferences = null;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    _debug = Log.getDebug();
    if (_debug) Log.v("MainPreferenceActivity.onCreate()");
    _debugCalendar = Log.getDebugCalendar();
    _context = MainPreferenceActivity.this;
    _preferences = PreferenceManager.getDefaultSharedPreferences(_context);
    _preferences.registerOnSharedPreferenceChangeListener(this);
    //Don't rotate the Activity when the screen rotates based on the user preferences.
    if(!_preferences.getBoolean(LANDSCAPE_SCREEN_ENABLED_KEY, false)){
        this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }
    addPreferencesFromResource(R.xml.preferences);
    setupCustomPreferences();
    runOnceAlarmManager();
    setupAppDebugMode(_debug);
    setupRateAppPreference();
    setupImportPreferences();
    runOnceEula();
}

最佳答案

我假设您正在运行 Gingerbread,所以我正在查看 Android 源代码的 Gingerbread 版本。

你看

08-04 01:06:50.697: ERROR/AndroidRuntime(9683):     at android.preference.PreferenceManager.inflateFromResource(PreferenceManager.java:251)

因此,如果您查看 PreferenceManager.java 的第 251 行 here , 你会看到

   rootPreferences = (PreferenceScreen) inflater.inflate(resId, rootPreferences, true);

如果您查看充气器的代码 here ,您会看到它跳过了对 P 的强制转换,在本例中为 PreferenceScreen。所以它试图将您的类转换为 PreferenceScreen,但正如您所说,它扩展了 Preference。

是否可以让您的类扩展 PreferenceScreen? (仅从名称来看,它确实应该这样做!)。

关于java - 为什么我的 PreferenceScreen 会强制关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6936970/

相关文章:

java - 无法接收已发布的消息到 mqtt paho 上的订阅主题

android - 自定义 View 中的 ImageView 墙纸未在某些设备上显示

android - 在应用程序内截取屏幕截图

android - 唤醒锁、深度 sleep 和 gcm

java - 在 Maven 中成功构建仍然在 Eclipse 中显示错误

java - 如何在不同的类中使用一个类的 String 数组,以免代码行数过多

java - PAX-CDI : CdiContainerFactory and BundleTracker

Android PreferenceFragmentCompat 空格

database - 存储非常精细的用户偏好

django - 什么是最好的 django 配置文件/用户设置应用程序?