Android 在StaticLayout上设置最大行数

Android 在StaticLayout上设置最大行数,android,Android,StaticLayout.Builder是在API 23中引入的,我想针对较低的目标。如何使用原始构造函数为StaticLayout设置最大行数 引用上的属性似乎都是只读的。在API 22之后的StaticLayout类中,仍然有一个隐藏的构造函数,它接受许多参数: /** * @hide * @deprecated Use {@link Builder} instead. */ @Deprecated public StaticLayout(CharSequence sour

StaticLayout.Builder
是在API 23中引入的,我想针对较低的目标。如何使用原始构造函数为
StaticLayout
设置最大行数


引用上的属性似乎都是只读的。

在API 22之后的StaticLayout类中,仍然有一个隐藏的构造函数,它接受许多参数:

 /**
  * @hide
  * @deprecated Use {@link Builder} instead.
  */
 @Deprecated
 public StaticLayout(CharSequence source, int bufstart, int bufend,
                     TextPaint paint, int outerwidth,
                     Alignment align, TextDirectionHeuristic textDir,
                     float spacingmult, float spacingadd,
                     boolean includepad,
                     TextUtils.TruncateAt ellipsize, int ellipsizedWidth,
                     int maxLines)

如您所见,最后一个参数是最大行数。

此构造函数是隐藏的,似乎无法将其用于较旧的API。我甚至尝试使用反射设置私有字段
mMaximumVisibleLineCount
,但没有成功。但是我找到了一个向后兼容的解决方案,可以省略字符串并创建
StaticLayout
,直到
lineCount
返回所需的值

fun createStaticLayout(text: String, textWidth: Int, maxLines: Int, paint: TextPaint): StaticLayout =
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        StaticLayout.Builder
            .obtain(text, 0, text.length, paint, textWidth)
            .setAlignment(Layout.Alignment.ALIGN_NORMAL)
            .setMaxLines(maxLines)
            .setEllipsize(TextUtils.TruncateAt.END)
            .build()
    } else {
        var layout: StaticLayout? = null
        var maxLength: Int = min(text.length, 200) // Could be adjusted

        do {
            layout = StaticLayout(
                text.ellipsize(maxLength), paint, textWidth,
                Layout.Alignment.ALIGN_NORMAL, 1f, 0f,
                false
            )
            maxLength -= 10
        } while (layout!!.lineCount > maxLines)

        layout
    }

///.....

fun String.ellipsize(
    size: Int,
    ending: Char? = '…'
): String = if (this.isEmpty() || size <= 0) {
    ""
} else if (length <= size) {
    this
} else {
    this.substring(0, max(size - 1, 0)).let {
        if (ending == null) {
            it
        } else {
            it + ending
        }
    }
}


fun createStaticLayout(文本:字符串,文本宽度:Int,最大行:Int,绘制:文本绘制):StaticLayout=
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.M){
StaticLayout.Builder
.获取(文本、0、text.length、绘制、文本宽度)
.setAlignment(布局.对齐.对齐\u法线)
.setMaxLines(maxLines)
.setEllipsize(TextUtils.TruncateAt.END)
.build()
}否则{
变量布局:静态布局?=null
var maxLength:Int=min(text.length,200)//可以调整
做{
布局=静态布局(
text.ellipsize(maxLength)、paint、textWidth、,
布局.对齐.对齐\u法线,1f,0f,
假的
)
最大长度-=10
}while(布局!!.lineCount>maxLines)
布局
}
///.....
有趣的字符串。省略(
大小:Int,
结尾:Char?=“…”

):String=if(this.isEmpty()| | size我找到的唯一方法是使用反射来访问第四个构造函数,该构造函数接受在最后一个参数中设置
maxLines
,它对我有效:

try {
                Constructor<StaticLayout> constructor = StaticLayout.class.getConstructor(
                        CharSequence.class, int.class, int.class, TextPaint.class, int.class,
                        Layout.Alignment.class, TextDirectionHeuristic.class, float.class, float.class,
                        boolean.class, TextUtils.TruncateAt.class, int.class, int.class
                );
                constructor.setAccessible(true);
                StaticLayout sl = constructor.newInstance(text, 0, text.length(), textPaint, width,
                        aligment, TextDirectionHeuristics.FIRSTSTRONG_LTR, spacingMult, spacingAdd,
                        includePad, TextUtils.TruncateAt.END, width, maxLines);

            } catch (NoSuchMethodException | IllegalAccessException | InstantiationException | InvocationTargetException exception) {
                Log.d("TAG_APP", Log.getStackTraceString(exception));
            }
试试看{
构造函数=StaticLayout.class.getConstructor(
CharSequence.class,int.class,int.class,TextPaint.class,int.class,
Layout.Alignment.class,TextDirectionHeuristic.class,float.class,float.class,
boolean.class,TextUtils.TruncateAt.class,int.class,int.class
);
constructor.setAccessible(true);
StaticLayout sl=constructor.newInstance(text,0,text.length(),textPaint,width,
aligment,TextDirectionHeuristics.FIRSTSTRONG\u LTR,spacingMult,spacingAdd,
includePad、TextUtils.TruncateAt.END、宽度、最大线);
}catch(NoSuchMethodException | IllegalacessException | InstanceionException | InvocationTargetException异常){
Log.d(“TAG_APP”,Log.getStackTraceString(异常));
}

@IanWarburton能否请您确认问题已解决,并可能将其标记为已解决?Regardsconstructor已隐藏且不可用