类强制转换异常:无法从Checkboxpreference转换为SwitchPreference

时间:2014-05-26 15:29:14

标签: android preferenceactivity checkboxpreference

我无法识别代码的问题,似乎没有人面对这类问题,因此无法在堆栈溢出中跟踪此问题。

异常消息:

Caused by: java.lang.ClassCastException: android.preference.CheckBoxPreference cannot be cast to android.preference.SwitchPreference

代码:

private Preference preference;

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    addPreferencesFromResource(R.xml.settings);
    loadAllViews();
}

private void loadAllViews()
{
   if (VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH)
   {
        preference = (SwitchPreference) findPreference("preference"); //Exception occurs here.
   }
   else
   {
        preference = (CheckBoxPreference) findPreference("preference");
   }
}

__________________    __________________    __________________

settings.xml:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >

    <CheckBoxPreference
        android:key="preference"
        android:title="yes_or_no" />

</PreferenceScreen>

有人请帮我解决。

3 个答案:

答案 0 :(得分:3)

CheckBoxPreference没有extends SwitchPreference;因此它不能被投射到它。这两个类都是TwoStatePreference的孩子。

从您的代码中,您似乎引用了两个不同首选项组件的一个首选项键:

  if (VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH)
   {
        preference = (SwitchPreference) findPreference("preference"); //Exception occurs here.
   }
   else
   {
        preference = (CheckBoxPreference) findPreference("preference");
   }

正如您所看到的,这适用于正确的首选项类型,但它会为不正确的类型抛出ClassCastException。确保您引用了正确的TwoStatePreference

的正确密钥

答案 1 :(得分:0)

<?xml version="1.0" encoding="utf-8"?>

<SwitchPreference
    android:key="preference1"
    android:title="yes_or_no" />

<CheckBoxPreference
    android:key="preference2"
    android:title="yes_or_no" />

代码中:

偏好偏好;

if(VERSION.SDK_INT&gt; = VERSION_CODES.ICE_CREAM_SANDWICH)
   {
        preference =(SwitchPreference)findPreference(“preference1”);
   }
   否则
   {
        preference =(CheckBoxPreference)findPreference(“preference2”);
   }

答案 2 :(得分:0)

需要有两个单独的布局。

一个用于布局目录中的检查首选项。

另一个适用于layout-v14目录的SwitchPreference。