【问题标题】:What alternative to "getTextDirection()" in Android API older than 17?17 岁以上的 Android API 中“getTextDirection()”的替代方法是什么?
【发布时间】:2015-06-15 19:02:06
【问题描述】:

在 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. 是否有替代机制我应该重写此方法以使用?

【问题讨论】:

    标签: android


    【解决方案1】:

    没关系。将此问题留在这里,以防对其他人有用,以了解如何解决给定版本中缺少的 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 之后才进行这样的更改,以确保可以安全地忽略投诉。

    在我的例子中,清单的最低 API = 15 和目标 API = 19,两个抱怨是“调用需要 API 级别 17,最低为 15)”,以及

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
    

    指示小于 17 的所有设备使用单行实现,它不使用 API 17 调用。也就是说,调用只会在 API 17 或更高版本的设备上进行。

    【讨论】:

      【解决方案2】:

      您可以将 android.support.v4 中的 ViewCompat 与类似的东西一起使用:

      if (ViewCompat.getLayoutDirection(mView) == ViewCompat.LAYOUT_DIRECTION_RTL) {
          //...
      }
      

      【讨论】:

        猜你喜欢
        • 2014-01-05
        • 1970-01-01
        • 1970-01-01
        • 2018-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-26
        • 2020-04-19
        相关资源
        最近更新 更多