【问题标题】:Make drawable left to text in Textview in Android在Android的Textview中使可绘制的左侧文本
【发布时间】:2014-03-28 18:17:58
【问题描述】:

我有一个文本视图和一个“点”的可绘制对象,现在当我用文本填充文本视图时,可绘制对象有时会在文本较小时移动到极左,而有时在文本较大时靠近文本

我已通过 android:drawableLeft="@drawable/blue" 将可绘制对象设置在 TextView 的左侧 我想在 textView 中的文本之前设置为只剩下 8 个密度像素 当文本变为 2 到 3 行时,它位于 TextView 的中心,我希望它位于第一行的左侧。 请给点建议

<TextView
    android:id="@+id/name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/numberLookup"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="60dp"
    android:drawableLeft="@drawable/blue"
    android:ems="10"
    android:fontFamily="sans-serif"
    android:gravity="center"
    android:textIsSelectable="false"
    android:textSize="23sp"
    android:textStyle="bold"
    android:visibility="visible" />

谁能帮我解决这个问题?

【问题讨论】:

  • 添加 android:drawablePadding="8dp" 就可以了
  • 不,它不工作:(
  • 你能画出你想要的和你得到的
  • 真的需要android:ems="10"吗?

标签: android xml


【解决方案1】:

drawableLeft 下车到最左角是正常行为。相反,您可以在文本开头设置ImageSpan

final Spannable spannable = new SpannableString(getText(R.string.yourText));
spannable.setSpan(new ImageSpan(getDrawable(R.drawable.icon)), 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spannable);

如果你有一个多行文本,每行都应该以一个点开始,你可以创建一个LeadingMarginSpan

public final class DotSpan implements LeadingMarginSpan {

    private final Bitmap mSpan;

    private final int mMargin;

    public DotSpan(final Bitmap span) {
        mSpan = span;
        mMargin = span.geWidth();
    }

    @Override
    public void drawLeadingMargin(Canvas c, Paint p, int x, int dir, int top,
            int baseline, int bottom, CharSequence text, int start, int end,
            boolean first, Layout layout)
    {
        if (first) {
            c.drawBitmap(mSpan, x, top, p); //not sure about coordinates if they are correct
        }
    }

    @Override
    public int getLeadingMargin(boolean first)
    {
        return mMargin;
    }
}

然后设置成这样

final Spannable spannable = new SpannableString(getText(R.string.yourMultilineText));
spannable.setSpan(new DotSpan(bitmap), 0, spannable.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
textView.setText(spannable);

【讨论】:

  • 显示新 ImageSpan(R.drawable.icon) 错误 -- 无法将图标转换为位图
  • @Hitesh 抱歉,应该是 new ImageSpan(getDrawable(R.drawable.icon));更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-29
  • 2013-10-22
  • 1970-01-01
  • 2022-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多