Работа с устаревшими методами в android

В настоящее время я создаю приложение для таргетинга API 23 с минимальным API 19.
В API 23 были заменены некоторые из методов компонента android.widget.TimePicker.

Например:

TimePicker.getCurrentHour(); 

Был заменен:

 TimePicker.getHour(); 

Теперь, когда я использую TimePicker в своем приложении, я должен проверить, использует ли устройство API 22 или выше со следующим оператором if:

 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 в его реализацию).

Правильно ли это? Или есть лучшее решение?

благодаря

Solutions Collecting From Web of "Работа с устаревшими методами в android"

То, как вы это делали, является хорошей практикой, насколько я могу читать из показанной части.

Однако, как я видел до сих пор, наилучшей практикой было создание разных подразделений из каждого класса, который вы планируете публиковать, и складывать программу во время установки.

Это в основном означает, что 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 рекомендуемых способа:

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

Лучше использовать новые имена методов. Таким образом, вы можете в конечном итоге избавиться от своего класса совместимости, когда вы поднимете версию 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(); } }