2015-10-14 18 views
13


我目前建立一個應用定位API 23,具有19
最小API在API 23一些的android.widget.TimePicker組件的方法代替。
與棄用方法處理在機器人

例如:

TimePicker.getCurrentHour(); 

被代替:

TimePicker.getHour(); 

現在,在我的應用程序使用TimePicker當我應該檢查該設備是否正在使用API​​ 22或以上的下列如果聲明:

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

我所做的是擴展TimePicker類和impl ementing過時方法是這樣的:

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類的在他實施進口)。

這樣做是正確的嗎?或者有更好的解決方案?

謝謝

+2

這是一個很好的方式。在我看來,你釘了它! :)也許你的方法應該按照新的名字約定來命名,當你放棄對M之前的支持時,使得轉換更容易。 – Kenneth

+0

嘿,這個.M是關於什麼的? –

+0

Build.VERSION_CODES.M是指API 23(Android Marshmallow) –

回答

3

就我所能看到的部分而言,您執行的方式是一種很好的做法。

但是,正如我迄今爲止所看到的,最佳做法是對每個您打算髮布的類進行不同的細分,並在安裝期間堆疊該程序。

這基本上意味着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(); 
    } 
} 
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(); 
    } 
} 
3

你做了什麼是好的,但可能不是最好的解決方案,因爲:

  • 您使用的是舊法的名稱,而不是新的
  • 創建一個自定義類強迫你使用自定義類在你的佈局和代碼中取代框架的類。如果可以的話,最好避免創建自定義視圖。

通常有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); 
     } 
    } 

}