你能否告诉我是否有办法在图像周围布置文字?像这样:
------ text text text
| | text text text
----- text text text
text text text text
text text text text
Run Code Online (Sandbox Code Playgroud)
我从android开发者那里得到了关于这个问题的回复.但我不确定通过自己的TextView版本意味着什么?感谢任何提示.
2010年2月8日星期一晚上11:05,Romain Guy写道:
嗨,
仅使用提供的小部件和布局无法做到这一点.您可以编写自己的TextView版本来执行此操作,这应该不难.
我花了几个小时寻找答案,真的不知道如何解决它.让我们开始做生意:
有一个形象,一个TextView和我需要的流动TextView围绕ImageView这样的:
第一种可能的解决方案是使用https://github.com/deano2390/FlowTextView,但它没有扩展,TextView所以这个库不适合我,原因有很多.
第二个解决方案是使用LeadingMarginSpan.LeadingMarginSpan2span,但它会影响文本中每n行的每个段落(比如在这个答案 - > 如何布局文本以围绕图像流动),所以我得到像这样的smth:
但我想只为前n行设置保证金!然后我决定实现LeadingMarginSpan.Standart并创建一个计数器并在getLeadingMargin(first: Boolean): Int函数调用中增加它.当计数器达到理想值时,函数返回0作为边距宽度.再次失败了!TextView文本只是向左移动而不是传播到视图的末尾,而不是填充线条!
UPD:是的,我onGlobalLayoutListener在这里用过
好吧,谷歌搜索另一个解决方案,我发现这个答案/sf/answers/1894505791/ 好的,我已完成所描述的一切并实现了代码:
//set left margin of desirable width
val params: RelativeLayout.LayoutParams = RelativeLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
params.leftMargin = holder.imageContainerHeight!!
params.addRule(RelativeLayout.BELOW, holder.mNumberAndTimeInfo!!.id)
holder.mCommentTextView!!.layoutParams = params
if (holder.commentTextViewOnGlobalLayoutListener != null)
holder.mCommentTextView!!.viewTreeObserver.removeOnGlobalLayoutListener(
holder.commentTextViewOnGlobalLayoutListener)
//add onGlobalLayoutListener
holder.mCommentTextView!!.viewTreeObserver.addOnGlobalLayoutListener(
if (holder.commentTextViewOnGlobalLayoutListener != null)
holder.commentTextViewOnGlobalLayoutListener
else CommentTextViewOnGlobalLayoutListener(holder,
SpannableString(HtmlCompat.fromHtml(
mView.getActivity(), commentDocument.html(), 0,
null, SpanTagHandlerCompat(mView.getActivity())))))` …Run Code Online (Sandbox Code Playgroud) 通过遵循这个问题,我能够在图像周围添加文字。但是,我有以下问题。

正如您所看到的,顶部图像的空间显示在右侧的每个段落中。在这个问题中,有人遇到了这个问题,并建议将“ss.length()”更改为“lines”。这似乎有效,除非第一段太短,下一段会与图像重叠。
我稍微修改了 FlowTextHelper 类以使用 Html 中的文本。这是我正在使用的代码:
public class FlowTextHelper {
private static boolean mNewClassAvailable;
/* class initialization fails when this throws an exception */
static {
try {
Class.forName("android.text.style.LeadingMarginSpan$LeadingMarginSpan2");
mNewClassAvailable = true;
} catch (Exception ex) {
mNewClassAvailable = false;
}
}
public static void tryFlowText(String text, View thumbnailView, TextView messageView, Display display, int addPadding){
// There is nothing I can do for older versions, so just return
if(!mNewClassAvailable) return;
// Get height and width of the …Run Code Online (Sandbox Code Playgroud)