在 Android 应用程序中,我们希望有一个类似 iOS 的水平滚轮,我们正在使用 HorizontalPicker .
这需要 API 17 来调用 getTextDirection() 和 getLayoutDirection()。
对于getTextDirection,用法是:
switch (getTextDirection()) {
default:
case TEXT_DIRECTION_FIRST_STRONG:
return (defaultIsRtl ? TextDirectionHeuristicsCompat.FIRSTSTRONG_RTL :
TextDirectionHeuristicsCompat.FIRSTSTRONG_LTR);
case TEXT_DIRECTION_ANY_RTL:
return TextDirectionHeuristicsCompat.ANYRTL_LTR;
case TEXT_DIRECTION_LTR:
return TextDirectionHeuristicsCompat.LTR;
case TEXT_DIRECTION_RTL:
return TextDirectionHeuristicsCompat.RTL;
case TEXT_DIRECTION_LOCALE:
return TextDirectionHeuristicsCompat.LOCALE;
}
查看仪表板,我看到约 20% 的设备使用 API 15 或 16,因此我认为我们应该以 API 15 而不是 17 为目标。
我应该如何更改此代码?
有没有办法只在设备足够新的情况下运行这段代码?如果是这样,该函数应该为旧设备返回什么?
是否有我应该重写此方法以使用的替代机制?
最佳答案
没关系。将此问题留在这里以防它对其他人有用,以了解如何解决给定版本中缺少的 API。
我真正的问题是不知道如何标记调用以便“lint”不会提示它们。
这是 HorizontalPicker 中的完整实现:
private TextDirectionHeuristicCompat getTextDirectionHeuristic() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
return TextDirectionHeuristicsCompat.FIRSTSTRONG_LTR;
} else {
// Always need to resolve layout direction first
final boolean defaultIsRtl = (getLayoutDirection() == LAYOUT_DIRECTION_RTL);
switch (getTextDirection()) {
default:
case TEXT_DIRECTION_FIRST_STRONG:
return (defaultIsRtl ? TextDirectionHeuristicsCompat.FIRSTSTRONG_RTL :
TextDirectionHeuristicsCompat.FIRSTSTRONG_LTR);
case TEXT_DIRECTION_ANY_RTL:
return TextDirectionHeuristicsCompat.ANYRTL_LTR;
case TEXT_DIRECTION_LTR:
return TextDirectionHeuristicsCompat.LTR;
case TEXT_DIRECTION_RTL:
return TextDirectionHeuristicsCompat.RTL;
case TEXT_DIRECTION_LOCALE:
return TextDirectionHeuristicsCompat.LOCALE;
}
}
}
它已经具有处理旧版本的逻辑!
所以只需要标记 getLayoutDirection() 和 getTextDirection() 这两个调用,这样 lint 就不会报错。
这样做最简单的方法是标记此方法以抑制对 API 版本的 lint 投诉,而不会将问题隐藏在其他地方:
@SuppressLint("NewApi")
private TextDirectionHeuristicCompat getTextDirectionHeuristic() {
...
注意:只有在检查 lint 投诉和逻辑以及您的 AndroidManifest.xml 之后,才能进行此类更改,以确保可以安全地忽略投诉。
在我的例子中, list 具有最小 API = 15 和目标 API = 19,两个投诉是“调用需要 API 级别 17,最小为 15)”,和
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
指示所有小于 17 的设备使用不使用 API 17 调用的单行实现。也就是说,调用只会在 API 17 或更高版本的设备上进行。
关于android - 在 17 岁以上的 Android API 中, "getTextDirection()"有什么替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30853029/