如何让textview完全包装这样的文本?
android:width属性不是解决方案,因为文本是动态的。
期望的行为
|Adcs |
|adscfd|
目前的行为:
|Adcs |
|adscfd |
这里是代码(TextViews的样式只定义textColor,textSize,textStyle等)。
<TextView
android:id="@+id/text_title_holder"
style="@style/TextBold.Black.Title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:maxWidth="100dp"
android:maxLines="2"
android:text="Adcs adscfd"
android:gravity="left"
android:visibility="visible" />
答案 0 :(得分:12)
我遇到了这个问题,并没有在互联网上找到解决方案。我通过创建新组件TightTextView来完成这个技巧,该组件重新测量给定文本,以防你指定组件的maxWidth并且Layout(文本)的宽度小于视图的测量宽度。
package com.client.android.app.views;
import android.content.Context;
import android.text.Layout;
import android.util.AttributeSet;
import android.widget.TextView;
/**
* Tightly wraps the text when setting the maxWidth.
* @author sky
*/
public class TightTextView extends TextView {
private boolean hasMaxWidth;
public TightTextView(Context context) {
this(context, null, 0);
}
public TightTextView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public TightTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if (hasMaxWidth) {
int specModeW = MeasureSpec.getMode(widthMeasureSpec);
if (specModeW != MeasureSpec.EXACTLY) {
Layout layout = getLayout();
int linesCount = layout.getLineCount();
if (linesCount > 1) {
float textRealMaxWidth = 0;
for (int n = 0; n < linesCount; ++n) {
textRealMaxWidth = Math.max(textRealMaxWidth, layout.getLineWidth(n));
}
int w = Math.round(textRealMaxWidth);
if (w < getMeasuredWidth()) {
super.onMeasure(MeasureSpec.makeMeasureSpec(w, MeasureSpec.AT_MOST),
heightMeasureSpec);
}
}
}
}
}
@Override
public void setMaxWidth(int maxpixels) {
super.setMaxWidth(maxpixels);
hasMaxWidth = true;
}
@Override
public void setMaxEms(int maxems) {
super.setMaxEms(maxems);
hasMaxWidth = true;
}
}
!!!刚刚将它移植到较旧的Android API,因为getMaxWidth()仅在API级别16之后可用。
答案 1 :(得分:1)
这个问题现在有点老了,但是我也遇到了这个问题,我希望在mapView上的黑框中使用绿色文本,并将我的textView放在RelativeLayout容器中。然后我使用填充来设置边框大小。 textView现在可以很好地拥抱文本。 我在Eclipse中的大纲看起来像这样。
RelativeLayout
mapview
LinearLayout
RelativeLayout
textView1 << this is the box I want to hug the text
imageView1
RelativeLayout
etc....
希望这有帮助。