Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在android中处理不推荐的方法_Java_Android_Deprecated_Deprecation Warning - Fatal编程技术网

Java 在android中处理不推荐的方法

Java 在android中处理不推荐的方法,java,android,deprecated,deprecation-warning,Java,Android,Deprecated,Deprecation Warning,我目前正在构建一个以API 23为目标的应用程序,最低API为19。 在API 23中,android.widget.TimePicker组件的一些方法被替换。 例如: TimePicker.getCurrentHour(); 替换为: TimePicker.getHour(); 现在,在我的应用程序中使用TimePicker时,我应该使用以下if语句检查设备是否使用API 22或更高版本: if (Build.VERSION.SDK_INT >= Build.VERSION_CODE


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

这样做对吗?还是有更好的解决方案


谢谢

就我所能从所示部分了解到的情况而言,您的表演方式是很好的实践

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

这基本上意味着
if(Build.VERSION.SDK\u INT>=Build.VERSION\u 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();
   }
}
最好使用新的方法名。这样,当您将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();
    }
}

您所做的是可以的,但可能不是最好的解决方案,因为:

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

1) 在升级minSDK之前,请继续使用不推荐的方法。它将在新实现中内部调用新方法:

@Deprecated
public void setCurrentHour(@NonNull Integer currentHour) {
    setHour(currentHour);
}
2) 创建一个静态助手类,该类将根据SDK版本调用正确的方法。这就是支持库为许多类所做的工作(,…):


这是个好办法。在我看来,你做到了!:)也许您的方法应该以新的名称约定命名,这样当您放弃对pre M的支持时,转换就更容易了。嘿,这个.M是关于什么的?Build.VERSION_CODES.M是指API 23(Android Marshmallow)。我将所有需要版本检查的方法保留在一个单独的类中(SDKHelper)因此,如果未来需求发生变化,应用程序代码不会被各种类别的检查弄得乱七八糟,那么它们都在一个地方。你能给我举个例子吗?
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);
        }
    }

}