我的问题是,当我在用户名右侧的Feed中注入用户评论时,整个评论区出现在右侧。它看起来很粗糙和笨拙。我想实现类似于Instagram的效果,其中第一行直接出现在用户名之后,第二行和所有后续行都在其下面。我想知道是否有任何常见的XML技巧将我的注释String的第二行和所有后续行包装在用户名String下面,就像在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 :(得分:1)
尝试只使用一个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>
答案 1 :(得分:0)
所以我做了一些研究,并使用SpannableString将LeadingMarginSpan设置为&#34; dp&#34;这只是略大于用户名的长度!大。有用。嗯,这是一个好的开始。它适用于一个唯一的用户名长度。
现在我必须根据用户名字符串的长度动态设置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:
我有用于存储用户名的字符串,所以我得到了它的长度,然后将该值乘以我称为&#34; usernameSpan&#34;的因子。 (设置为&#34; 150&#34;以上)。
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(发现文本视图的宽度似乎非常不可靠),并选择将用户名和注释直接放在彼此之上。注释String包含从我们的服务器中提取的用户名,以便每个唯一注释的间距匹配。如果我能够以某种方式使这个组合字符串的用户部分不可见,那么我们自己就会有一个有效的解决方案。虽然有点麻烦,但
最终工作解决方案:
对于我的特殊问题,我需要使用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);
}