处理安卓系统中已弃用的方法


我目前正在构建一个面向 API 23 的应用,最低 API 为 19。
在API 23中,android.widget.TimePicker组件的一些方法被替换了。

例如:

TimePicker.getCurrentHour();

改为:

TimePicker.getHour();

现在,在我的应用程序中使用TimePicker时,我应该使用以下if语句检查设备是否正在使用API 22或更高版本:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
        TimePicker.getHour();
    else
        TimePicker.getCurrentHour();

我所做的是扩展TimePicker类并实现不推荐使用的方法,如下所示:

public class TimePicker extends android.widget.TimePicker {

    public TimePicker(Context context) {
        super(context);
    }

    public void setCurrentHour(int hour) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
            super.setHour(hour);
        else
            super.setCurrentHour(hour);
    }

    public void setCurrentMinute(int minute) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
            super.setMinute(minute);
        else
            super.setCurrentMinute(minute);
    }

    public int getCurrentHour() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
            return super.getHour();
        else
            return super.getCurrentHour();
    }

    public int getCurrentMinute() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
            return super.getMinute();
        else
            return super.getCurrentMinute();
    }
}

因此,使用此类的用户不会影响方法的更改(他应该只在他的实现中替换 TimePicker 类的导入)。

这样做是正确的方式吗?还是有更好的解决方案?

谢谢


答案 1

就我从所示部分阅读到的,您的执行方式是很好的做法。

但是,正如我到目前为止所看到的,最佳做法是从要发布的每个类中进行不同的细分,并在安装过程中堆叠程序。

这基本上意味着在班级中名列前茅。if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)

如果你的项目打算在更多版本下进行,我建议这样做:

public class Example extends moreExamples implements additionalExamples{
   switch(Build.VERSION.SDK_INT){
      case Build.VERSION_CODES.M:
         codeVersionM();
         break;
      case Build.VERSION_CODES.L:
         codeVersionL();
         break;
      case Build.VERSION_CODES.K:
         codeVersionK();
         break;
      default:
         errorNoBuildImplemented();
   }
}

答案 2

你做了什么是可以的,但可能不是最好的解决方案,因为:

  • 您使用的是旧方法名称,而不是新方法名称
  • 创建自定义类会强制您在布局和代码中使用该自定义类来替换框架的类。如果可以,最好避免创建自定义视图。

通常有 2 种推荐的方法:

1) 继续使用已弃用的方法,直到升级 minSDK。它将在新实现中内部调用新方法:

@Deprecated
public void setCurrentHour(@NonNull Integer currentHour) {
    setHour(currentHour);
}

2) 创建一个静态帮助器类,该类将根据 SDK 版本调用正确的方法。这就是支持库已经为许多类(TextViewCompatViewCompat等)所做的:

public class TimePickerCompat {

    public static void setHour(TimePicker timePicker, int hour) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            timePicker.setHour(hour);
        } else {
            timePicker.setCurrentHour(hour);
        }
    }

}

推荐