2015-11-06 92 views
1

I've sufficed to put the user comment below the username for now, because otherwise the comment appears in a block directly to the right of the username and looks very awkward.包装注释文本

You'll see on this Instagram example, the beginning of the comment begins right after the username but then wraps to beneath the username on all subsequent lines.

我的问题是,当我注入我的饲料,以用户名的权限的用户评论,整个注释块出现在对。它看起来笨重和尴尬。我想达到类似于Instagram的效果,其中第一行直接出现在用户名后面,第二行和后面的所有行都在它下面。我想知道是否有任何常见的XML技巧将我的评论字符串的第二行和后续所有行都包装在用户名字符串下,就像在Instagram上所做的那样。

我的第二个想法是以编程方式拆分注释对象中的行,并将几个短字符串附加在一起形成一个单一的粘性注释块。

任何有经验的UI开发人员都知道任何技巧?我如何计算用户名的长度?我想只是缩进第一行,但是这样做,只会在你假设每个人都有相同的用户名长度时才起作用,这显然不是一个好的假设。如果没有,有没有人使用后端达到这样的效果?如果是这样,那么开始这样的事情会是一个好的第一方向?

的XML:

<LinearLayout 
    android:id="@+id/comment1Layout" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:layout_marginLeft="15dp" 
    android:layout_marginStart="15dp"> 

     <RelativeLayout 
     android:id="@+id/comment1Layout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/commentUser1" 
     tools:text="commentUsername" 
     android:textColor="#44d7a8" 
     android:textStyle="bold" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/commentText1" 
     tools:text="This is a comment." 
     android:textColor="#000000" 
     android:paddingRight="10dp" /> 

    </RelativeLayout> 

</Linear Layout> 

回答

0

Link inside comment

尝试使用只是一个TextView的:

user = (TextView) findViewById(R.id.commentUser1); 
user.setText(Html.fromHtml(getString(R.string.commentUserName))); 
user.setMovementMethod(LinkMovementMethod.getInstance()); 

和定义字符串: <string name="commentUserName"><![CDATA[<a href="http://www.google.com">commentUsername</a>]]> Los textos simulados son aquellos textos que, en ausencia de un texto definitivo, sirven como sustituto de futuros contenidos en la producción de maquetas para publicaciones o sitios web. También son llamados textos dummy, ficticios o de relleno.</string>

+0

借口图片的大小 –

+0

你能看看我的第二更新的答案在上面我无法使用HTML或XML,因为字符串是从我的服务器加载的。有什么办法可以直接修改我新连接字符串的第一部分的样式吗?这是感兴趣的一行:new Object [] {commentUser1.getText()。toString()。例如,我可以将字符串的这部分变成粗体还是绿色,或者更好吗? – santafebound

0

所以我做了一些研究,并用来SpannableString到LeadingMarginSpan设定为:在“DP”,也就是只比用户名的长度略大!大。有用。那么,这是一个好的开始。它适用于一个唯一的用户名长度。

现在我必须根据用户名字符串的长度动态设置LeadingMarginSpan的长度。

public void setCommentText1(String text) { 
    SpannableString s = new SpannableString(text); 
    s.setSpan(new android.text.style.LeadingMarginSpan.Standard(150, 0), 0, s.length(), 0); 
    commentText1.setText(s); 
} 

无论如何,我希望这可以帮助别人!

更新1:

我对存储的用户名字符串,所以我只是得到了它的长度,然后把该值乘以一个我称为“usernameSpan”(设置为“150”以上)的因素。

public void setCommentText1(String text) { 
    int usernameLength = username.length(); 
    int usernameSpan = 35; 
    SpannableString s = new SpannableString(text); 
    s.setSpan(new android.text.style.LeadingMarginSpan.Standard(usernameLength*usernameSpan, 0), 0, s.length(), 0); 
    commentText1.setText(s); 
} 

这还不是最好的答案。理想情况下,我会得到字符串的最大Ems,并将其乘以用户名,以便LeadingMarginSpan等于用户名+允许评论开始的一点空间。我试过username.getMaxEms(),但似乎不起作用,因为用户名字符串是动态设置的,所以我不知道在字符串填充后它是否真的知道整个字符串的最大Ems。如果有人有任何建议,我会很感激!谢谢。

为什么不连接?

他们不应该只是串联的一个原因是用户名TextView有一些编程元素,比如链接到配置文件。所以最佳解决方案必须看起来像上面的东西。

更新2:

public void setCommentText1(String text) { 
    commentText1.setText(String.format("%s %s", new Object[]{commentUser1.getText().toString(), text})); 
} 

我已经删除了leadingMarginSpan(查找文本视图的宽度似乎是非常不可靠的),并选择了将用户名和评论字符串直接在一个顶部另一个。注释字符串包含从我们的服务器拉出的用户名,以便为每个唯一注释匹配空格。如果我能以某种方式使这个组合字符串的用户部分不可见,那么我们有一个工作,尽管稍微凌乱,解决方案。

最后的工作液:

对于我的具体问题,我需要使用SpannableStringBuilder样式的CONCAT字符串的第一部分(该结束了commentUsername1Spannable),以配合我原来的用户名的TextView的颜色和然后留下第二部分(文本或注释字符串)而不进行格式化。有用!

public void setCommentUser1(String text) { 
    commentUser1.setText(text); 
} 

public void setCommentText1(String text) { 
    SpannableStringBuilder builder = new SpannableStringBuilder(); 
    String commentUsername1 = commentUser1.getText().toString(); 
    SpannableString commentUsername1Spannable = new SpannableString(commentUsername1); 
    commentUsername1Spannable.setSpan(new ForegroundColorSpan(Color.rgb()), 0, commentUsername1Spannable.length(), 0); 
    builder.append(commentUsername1Spannable); 
    builder.append(" "); 
    builder.append(text); 
    commentText1.setText(builder, TextView.BufferType.SPANNABLE); 
}