gpt4 book ai didi

Android - EditText 设置前缀始终可见

转载 作者:行者123 更新时间:2023-11-30 00:20:06 25 4
gpt4 key购买 nike

我制作了一个可以添加前缀的自定义 EditText,这很好用,但我希望我的前缀保持可见,即使键入的文本太大。

Here你可以看到我的带有前缀的 EditText。
here你可以看到我面临的问题。

这是我的 Edittext 类:

public class MyEditText extends android.support.v7.widget.AppCompatEditText
{
private String mPrefix;
private Rect mPrefixRect = new Rect();

public void setPrefix(final String prefix)
{
mPrefix = prefix;
}

public MyEditText(final Context context)
{
super(context);
mPrefix = "";
}

public MyEditText(final Context context, AttributeSet attributeSet)
{
super(context, attributeSet)
TypedArray a = context.getTheme().obtainStyledAttributes(attributeSet, R.styleable.MyEditText, 0, 0);
mPrefix = a.getString(R.styleable.MyEditText_prefix);
if (mPrefix == null)
mPrefix = "";
a.recycle();
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
getPaint().getTextBounds(mPrefix, 0, mPrefix.length(), mPrefixRect);
if (!mPrefix.matches(""))
mPrefixRect.right += getPaint().measureText(" "); // add some offset
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

@Override
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);
Paint paint = getPaint();
paint.setColor(Color.BLACK);
canvas.drawText(mPrefix, super.getCompoundPaddingLeft(), getBaseline(), paint);
}

@Override
public int getCompoundPaddingLeft()
{
return super.getCompoundPaddingLeft() + mPrefixRect.width();
}
}

编辑

根据要求有我的 R.styleable.MyEditText:

<resources>
<declare-styleable name="MyEditText">
<attr name="prefix" format="string" />
<attr name="parentLayout" format="reference"/>
</declare-styleable>
</resources>

还有我使用 MyEditText 的 XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="thurluth.popups.MainActivity"
android:id="@+id/main_layout">

<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

<MyEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:prefix="Login :"
app:parentLayout="@id/main_layout"
android:layout_toEndOf="@+id/button"
android:inputType="text"/>

</RelativeLayout>

解决方案

对于那些和我有同样问题的人,有解决方案:

您必须在自定义 EditText 中覆盖 onDraw 函数

@Override
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);
Paint paint = getPaint();
paint.setColor(Color.BLACK);
float prefixPosX = 10; //I added some offset at the left the prefix
if (paint.measureText(getText().toString()) > getWidth() - (paint.measureText(mPrefix + " ")) - 10)
prefixPosX = paint.measureText(getText().toString() + offset) - (getWidth() - (paint.measureText(mPrefix + " ")));
canvas.drawText(mPrefix, prefixPosX, getBaseline(), paint);
}

最佳答案

因为是自己的View,所以可以重写onDraw方法。传递的 Canvas 包含一个名为 drawText 的方法。设置它的位置,创建所需的 Paint - 对象让它很酷,你就可以开始了:-)

关于Android - EditText 设置前缀始终可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46468252/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com