setCompoundDrawables在EditText中的应用导致文本重叠。

8
我正在使用setCompoundDrawablesDrawable作为文本放置在我的EditText开头,但我得到了错误的结果。我需要的是在输入时文本从Drawable之后开始,但实际上我得到了这个结果。
我有一个像这样定义的布局中的EditTextenter image description here
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/control"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:paddingLeft="4dp" >

    <EditText
        android:id="@+id/field"
        style="@style/TextField"
        android:inputType="number" />

</LinearLayout>

我需要将一段文本作为Drawable添加到EditText的开头。因此,我使用这个class将文本转换为Drawable

public class TextDrawable extends Drawable {

    private final String text;
    private final Paint paint;

    public TextDrawable(String text) {
        this.text = text;
        this.paint = new Paint();
        paint.setColor(Color.parseColor("#009999"));
        paint.setTextSize(30);
        paint.setAntiAlias(true);
        paint.setTextAlign(Paint.Align.LEFT);
    }

    @Override
    public void draw(Canvas canvas) {
        canvas.drawText(text, 0, 6, paint);
    }

    @Override
    public void setAlpha(int alpha) {
        paint.setAlpha(alpha);
    }

    @Override
    public void setColorFilter(ColorFilter cf) {
        paint.setColorFilter(cf);
    }

    @Override
    public int getOpacity() {
        return PixelFormat.TRANSLUCENT;
    }
}

我在这里实现它

final   EditText field   = (EditText) widget.findViewById(R.id.field);

field.setCompoundDrawables(new TextDrawable(this.label), null, null, null);
field.setText(this.value);

我做错了什么吗?

编辑

我尝试使用这种方法 field.setCompoundDrawablesWithIntrinsicBounds(R.drawable.my_drawable, 0, 0, 0);,它可以工作,但显然我不能使用它,因为drawable没有被定义为资源。

3个回答

4
如果你想在Drawable的构造函数中设置setBounds,或者重写getIntrinsicWidth()方法,你需要检查哪种方法适用。

1
谢谢,这个方法可行。我刚刚重写了getIntrinsicWidth()并返回了文本宽度。 - the-ginger-geek
不,set bounds 只是调整了 Drawable 的大小,没有改变起始位置。 - the-ginger-geek

1
你可以这样做。
<EditText
        android:id="@+id/editText1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:drawableLeft="@drawable/ic_launcher" >

这只支持Android Api v14及以上版本。我需要支持Api v8及以上版本。 - the-ginger-geek
即使我错了@Rajan,我也不能使用那种方法,因为文本需要是动态的。 - the-ginger-geek

0

尝试这样做-

field.setCompoundDrawablesWithIntrinsicBounds(new TextDrawable(this.label), null, null, null);

你必须设置边界。


谢谢回答!在发布问题之前,我已经尝试过了,但没有得到积极的结果。我认为这可能接近答案,但还缺少一些东西。 - the-ginger-geek
如果我使用这个方法 field.setCompoundDrawablesWithIntrinsicBounds(R.drawable.my_drawable, 0, 0, 0); 它可以工作,但显然我不能使用它,因为drawable没有被定义为资源。 - the-ginger-geek
我想,你的文本不是可绘制的,这就是为什么它在这里无法工作的原因。 - amit singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接