为什么我使用SwitchPreference会出现异常

时间:2013-07-02 12:05:31

标签: android android-preferences togglebutton android-2.2-froyo verifyerror

我想在api&gt; = 14时使用SwitchPreference sToggle并在api <14时使用CheckBoxPreference chToggle

我的代码出现异常

public class SettingsActivity extends PreferenceActivity {
SwitchPreference sToggle;
CheckBoxPreference chToggle;

...

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

...

if (VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH) {
        sToggle = new CheckBoxPreference(this);
        sToggle.setTitle("One");
        targetCategory.addPreference(sToggle);
    } else {
        chToggle = new CheckBoxPreference(this);
        chToggle.setTitle("Two");
        targetCategory.addPreference(chToggle);
    }
你帮我吗?)

2 个答案:

答案 0 :(得分:0)

SwitchPreference sToggle;由您的代码定义,即使在API级别&lt;那将是我所假设的例外。

该类在这些API级别上根本不存在,因此您根本不能使用它。有点甚至没有在代码中提到它。或者在技术上:不要做任何加载该类的事情。

但是,您可以将sToggle声明为存在的超类型的变量,例如

public class SettingsActivity extends PreferenceActivity {
    Preference sToggle;

然后将使用SwitchPreference的代码移动到另一个未在较低API级别加载的类中。 E.g。

 class ToggleNew {
      public static Preference getToggle() {
          return new SwitchPreference();
      }
 }
 class ToggleOld {
      public static Preference getToggle() {
          return new CheckboxPreference();
      }
 }

您的原始类现在可以动态使用/加载您想要的版本。

Preference p;
if (VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH) {
        p = ToggleNew.getToggle();
} else {
        p = ToggleOld.getToggle();
}

您需要稍微调整一下,但这是如何在某些API级别上使用类而不是在其他级别上使用类的一般方法。

答案 1 :(得分:0)

使用SwitchPreferenceCompat代替SwitchPreference。