在android中处理已弃用的方法

Mos*_*k L 13 java android deprecated deprecation-warning


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

例如:

TimePicker.getCurrentHour();
Run Code Online (Sandbox Code Playgroud)

被替换为:

TimePicker.getHour();
Run Code Online (Sandbox Code Playgroud)

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

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
        TimePicker.getHour();
    else
        TimePicker.getCurrentHour();
Run Code Online (Sandbox Code Playgroud)

我所做的是扩展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();
    }
}
Run Code Online (Sandbox Code Playgroud)

所以使用这个类的用户不会影响方法的更改(他应该只在他的实现中替换TimePicker类的导入).

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

谢谢

Bon*_*tti 5

就我从显示的部分中读到的而言,您的表现方式是一种很好的做法。

但是,正如我目前所见,最佳实践是对您打算发布的每个类进行不同的细分,并在安装过程中堆叠程序。

这基本上意味着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();
   }
}
Run Code Online (Sandbox Code Playgroud)