13


我目前正在构建一个针对 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 类的导入)。

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

谢谢

4

3 回答 3

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();
   }
}
于 2015-10-14T12:00:58.113 回答
2

你所做的没问题,但可能不是最好的解决方案,因为:

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

一般有2种推荐方式:

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

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

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

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);
        }
    }

}
于 2017-03-03T13:01:33.580 回答
1

最好使用的方法名称。这样,当您将 min sdk 版本提高到 23 时,您最终可以摆脱兼容性类,而无需更改导入以外的任何代码。

@SuppressWarnings("deprecation")
public class TimePicker extends android.widget.TimePicker
{
    public TimePicker(Context context)
    {
        super(context);
    }

    public TimePicker(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }

    public TimePicker(Context context, AttributeSet attrs, int defStyleAttr)
    {
        super(context, attrs, defStyleAttr);
    }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public TimePicker(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)
    {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

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

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

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

    public int getMinute()
    {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
            return super.getMinute();
        else
            return super.getCurrentMinute();
    }
}
于 2017-03-03T11:03:55.553 回答