1

通常在使用不推荐使用的方法时,我们使用类似这样的东西

public static void SetBackground(View view, Drawable icon) {
    if (Build.VERSION.SDK_INT >= 16)
        Helper.SetBackground(view, icon);
    else view.setBackgroundDrawable(icon);
}

public class Helper {
    public static void SetBackground(View view, Drawable icon) {
        view.setBackground(icon);
    }
}

现在,它只是一个例子。我的问题是,如果在未来的 API 中删除了一个已弃用的方法,那么应用程序最终会显示 VerifyError,因为它无法找到它,就像这里一样View.setBackgroundDrawable。也许我们需要使用 Helper2 类。

4

2 回答 2

0

这是处理这种事情的一个略显丑陋的技巧:

创建两个实现接口的类:

public interface DrawableUtil {
    void setBackground(View v, Drawable d);
}

public class PreJellyBeanDrawableUtil {
    void setBackground(View v, Drawable d) {
        v.setBackgroundDrawable(d);
    }
}
public class JellyBeanDrawableUtil {
    void setBackground(View v, Drawable d) {
        v.setBackground(d);
    }
}

现在您可以使用通常的习惯用法来构造适当的实现:

DrawableUtil util;
if (Build.VERSION.SDK_INT >= 16)
    util = new JellyBeanDrawableUtil();
else 
    util = new PreJellyBeanDrawableUtil();
util.setBackground(view, icon);

这不会受到 VerifyError 问题的影响,因为它永远不会在较新的平台上使用不推荐使用的方法加载类。

于 2013-07-02T08:37:30.077 回答
0

一种方法是您提到 API 级别。但更好的是使用反射并查看该方法是否被android版本支持或优雅地失败/使用更新的方法

 public static Method getResources;

    static {
            try {
                    Class<?> class[] = new Class[1];
                    class[0] = String.class;
                    getResources= Context.class.getMethod("getResources", class);
            } catch (NoSuchMethodException e) {
                    Log.e(TAG, "getResources is deprecated");
            }
    } 

将上述内容放在扩展应用程序类的类中,然后以这种方式调用它

MyClass extends Application { ...}

if(MyClass.getResources!= null){
           //Do stuff

  } else {

//Fail or do other stuff
}
于 2013-07-02T07:03:41.343 回答