Android: 有没有一种方法在EditText中应用右边距跨度?

7
我希望您能够提供类似于LeadingMarginSpan的东西,但能够将左右两侧的边距应用于文本,而不仅仅是左边距。
我的目标是在同一EditText中使某些段落比其他段落更窄,因此它可能看起来像这样:
blah blah blah blah blah blah blah blah
blah blah blah blah blah blah blah blah
blah blah

     blah blah blah blah blah blah
     blah blah blah blah blah blah
     blah blah blah blah blah blah
     blah

blah blah blah blah blah blah blah blah
blah blah blah blah blah blah blah blah
blah blah blah blah blah

据我所知,目前没有预定义的跨度(span)可以实现这一功能,而且我也不知道如何从头开始创建一个新的跨度来实现它。非常感谢您的任何帮助!

一个适用于您特定情况的解决方法是使用三个不同的TextView,中间的那个具有更多的填充。很遗憾没有 TrailingMarginSpan - Maarten
3个回答

4
你不能使用span设置正确的padding/margin。但你可以通过使用MetricAffectingSpan来欺骗它。 它有两个方法: updateMeasureState(在测量文本时调用) 和updateDrawState(在绘制文本时调用)。
因此,如果您在测量时增加textScaleX,则Android会生成较短的行。如果您在绘制时不增加textScaleX,则Android在绘制时不会缩放行。结果,您将获得更短的行。这会看起来像是正确的padding。
它并不完美:您无法以像素为单位设置正确的padding,但右侧会有一些padding。
以下是一个5%右侧padding的示例。
public class RoughtRightPaddingSpan extends MetricAffectingSpan {

    @Override
    public void updateMeasureState(TextPaint p) {
        p.setTextScaleX(1.05f);
    }

    @Override
    public void updateDrawState(TextPaint tp) {
    }
}

2
据我所知,目前没有预定义的范围可实现此功能。
AFAIK,你是正确的。
我不知道如何从头开始创建新范围以完成此操作。
好吧,支持LeadingMarginSpan已经内置在Layout和StaticLayout中,因此简单创建TrailingMarginSpan将不足够。您需要创建自己的Layout和StaticLayout的自定义子类,覆盖并克隆它们非常复杂的draw()方法,并注入您的TrailingMarginSupport。
简而言之,这将是痛苦的。
当然,如果您正在制作自己的固件,这将变得简单得多... :-)

你需要创建自己的Layout和StaticLayout子类,覆盖并克隆它们非常复杂的draw()方法,并加入TrailingMarginSupport。
也许这就是我必须做的。我现在要出门了,但如果我能让它工作,我会回来发布详细信息。
- Andy
抱歉回复晚了,比我预期的要晚。Android.text.Layout确实有一些代码看起来可以被覆盖以处理右边和左边的边距,但问题是TextView的Layout对象是私有的,不能被修改或设置,因此编写自己的扩展Layout类是没有意义的,因为没有办法将其放入TextView中。我能想到的唯一选择是将所有TextView复制到我的应用程序中,但这并不可行,因为TextView调用内部类,这些类对开发人员不直接可访问。 - Andy
无论如何,感谢您的帮助。至少让人放心的是,右边距跨度确实没有被实现,我不能做到并不是因为我疯了。 - Andy
3
@Andrew:不,你并不疯狂。至少在这方面不是。我无法评论你在其他话题上的理智程度... :-) - CommonsWare

0

我会改用WebView而不是TextView

使用WebView,您可以使用HTML标记,这提供了更多的格式选项


3
从内存消耗的角度来看,WebView 是一种更昂贵的小部件。如果将 WebView 放置在其他可滚动容器(例如 ListView)中,会带来问题。此外,楼主没有说他想要显示这个文本——也许他想要在一个 EditText 中编辑它。 - CommonsWare
没错。我正在尝试格式化的文本需要由用户进行编辑,因此使用Webview不是一个选项(这很不幸,因为我遇到了很多情况,如果能够使用HTML就可以省去很多麻烦)。 - Andy
在这种情况下,您可以找到一个已经具有此功能的好的开源编辑器项目或者将其改进以实现该功能。或者您需要从基础开始做所有工作(我猜测需要4-8周的时间)。也许您需要检查EditText的源代码。 - stefan bachert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接