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已隐藏且不可用