【问题标题】:Altering line wrap behavior改变换行行为
【发布时间】:2012-05-14 23:22:28
【问题描述】:

我可以在 TextViews 中使用 Spannable 来创建具有不同外观、下划线、删除线等的跨度。我如何做同样的事情来改变换行行为?特别是,我不希望电子邮件地址夹在中间,我希望它像一个单词一样。

我尝试了WrapTogetherSpan,但无法正常工作。貌似只有DynamicLayout使用,无法强制TextView使用DynamicLayout。

<TextView
  android:id="@+id/merchant_email_field"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:textSize="@dimen/account_setting_email"
  android:gravity="center"
  android:bufferType="spannable"
  android:maxLines="2"
  android:ellipsize="end"
  />

我如何设置 spannable:

WrapTogetherSpan TOGETHER_SPAN = new WrapTogetherSpan() {};
String collectedString = getString(R.string.email_sentence, userEmail);
int emailOffset = collectedString.indexOf(userEmail);
Spannable emailSpannable = Spannable.Factory.getInstance()
    .newSpannable(collectedString);
emailSpannable.setSpan(TOGETHER_SPAN, emailOffset,
    emailOffset + userEmail.length(),
    Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
textView.setText(emailSpannable)

【问题讨论】:

    标签: android textview word-wrap


    【解决方案1】:

    不知道你是否找到了答案,但你可以使用 unicode 来帮助你。

    有一个不可中断的空格字符,所以你需要用这个字符替换所有你想不可中断的空格(\u00A0)

    举个例子

    String text = "Hello World";
    text.replace(' ', '\u00A0');
    textView.setText(text);
    

    顺便说一句,我一直在寻找跨度解决方案但找不到,WrapTogetherSpan 只是一个接口,所以它不起作用......

    但如果你愿意,我相信你可以用这种方法制作一个自定义的牢不可破的跨度。

    【讨论】:

    • 好吧,这适用于空格。但是对于问题中提到的电子邮件地址,它没有帮助。我也许可以在其中粘贴不可见的字符,例如 U+FEFF 或 U+2060,但这很烦人,因为它必须在每个字符之间。
    【解决方案2】:

    如果您正在实施更底层的解决方案(即绘制自己的文本并自己处理换行),请参阅BreakIteratorBreakIterator.getLineInstance() 工厂方法将电子邮件地址视为一个单元。

    String text = "My email is me@example.com.";
    BreakIterator boundary = BreakIterator.getLineInstance();
    boundary.setText(text);
    int start = boundary.first();
    for (int end = boundary.next(); end != BreakIterator.DONE; end = boundary.next()) {
        System.out.println(start + " " + text.substring(start, end));
        start = end;
    }
    

    输出显示可以接受换行符的边界起始索引。

    0 My 
    3 email 
    9 is 
    12 me@example.com.
    

    另请参阅

    【讨论】:

      【解决方案3】:

      您是否尝试将android:singleLine="true" 添加到您的 XML 中?

      【讨论】:

      • 不,因为我想要最多两行。我只想将电子邮件地址组合成一个单词。
      • 抱歉,我之前不明白。现在更有意义了,为什么您要尝试使用 spannable 来做到这一点。 :)
      猜你喜欢
      • 1970-01-01
      • 2018-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多