android - 在 17 岁以上的 Android API 中, "getTextDirection()"有什么替代方案?

标签 android

在 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 为目标。

我应该如何更改此代码?

  1. 有没有办法只在设备足够新的情况下运行这段代码?如果是这样,该函数应该为旧设备返回什么?

  2. 是否有我应该重写此方法以使用的替代机制?

最佳答案

没关系。将此问题留在这里以防它对其他人有用,以了解如何解决给定版本中缺少的 API。

我真正的问题是不知道如何标记调用以便“lint”不会提示它们。

这是 Horizo​​ntalPicker 中的完整实现:​​

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/

相关文章:

android - 如何以编程方式在 Android 应用程序中启用和禁用 USB

android - 如何使用java在android中创建按钮数组

android - 创建自定义 android 选择器

Android facebook SDK 执行错误 java.lang.NoClassDefFoundError

android - 如何构建 tess-two(用于 android 的 tesseract 工具的分支)

android - 在 NFC Tap 上启动 Rhomobile 应用程序

android - 嵌套 fragment 通信

java - OnClickListener 处的 NullPointerException

android - 在android中缩放图像

android - 从 android ContactsContract 数据库加载数据后 fragment 未填充