【问题标题】:Type-Casting a java object according to Android SDK Level根据 Android SDK 级别对 java 对象进行类型转换
【发布时间】:2014-03-16 09:57:25
【问题描述】:

我以编程方式用 checkBoxPreference 对象填充一个列表。对于新的 android SDK,有一个之前没有实现的方法 setIcon()。

所以我扩展了 checkBoxPreference 类并实现了类似于gist 的 setIcon()。我的新类名为 IconCheckBoxPreference,它与 Kitkat [新 SDK] 存在问题。

我想要类似的东西

Object cbp;
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB){
    cbp        = new checkBoxPreference(this);
    casted_cbp = CastAccordingToClass(cbp, checkBoxPreference.class); //TODO!
}else{
    cbp = new IconCheckBoxPreference(this, null);
    casted_cbp = CastAccordingToClass(cbp, IconCheckBoxPreference.class); //TODO!
}
casted_cbp.setTitle("My Title");
casted_cbp.setIcon(getResources().getDrawable(R.drawable.bla));

并在没有其他 SDK 条件的情况下使用变量“casted_cbp”继续我的代码。 “casted_cbp”的类型可以做什么?有没有办法这样做? 在这种情况下,最佳做法是什么?

【问题讨论】:

  • 如果这两个没有包含您要在转换对象上使用的方法的公共超类,则不可能。
  • 普通超类其实是同一个类,有两个不同的版本:“checkBoxPreference”。旧版本没有 setIcon()。
  • ...that includes the methods you want to use on the casted object...

标签: java android class casting


【解决方案1】:

你想要的都是不可能的。

当编译器仍然知道确切的具体类时,您必须在 if 中设置图标。

至于转换,使用CheckboxPreference作为通用超类对象类型,所以你仍然可以独立于平台版本调用setTitle()

这就是代码的样子:

CheckBoxPreference cbp; 
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB){
    CheckBoxPreference pref = new checkBoxPreference(this); 
    pref.setIcon(getResources().getDrawable(R.drawable.bla));
    cbp = pref;
}else{ 
    IconCheckBoxPreference pref = new IconCheckBoxPreference(this, null); 
    pref.setIcon(getResources().getDrawable(R.drawable.bla));
    cbp = pref;
}
cbp.setTitle("My Title");

【讨论】:

    猜你喜欢
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 2015-02-26
    • 2015-01-03
    • 1970-01-01
    • 2015-11-25
    相关资源
    最近更新 更多