RTL 支持自定义编辑文本以绘制左侧

Rep*_*tor 3 android android-custom-view right-to-left android-edittext android-canvas

我有一个edittext,其中一个图像可绘制,左侧带有不可编辑的前缀editext,但现在我想让它支持rtl。尽管我付出了努力,但我还是无法支持 rtl。

我的自定义类如下,

public class PrefixedEditText extends TextInputEditText {

private String mPrefix = "+"; // can be hardcoded for demo purposes
private Rect mPrefixRect = new Rect(); // actual prefix size

public PrefixedEditText(Context context, AttributeSet attrs) {
    super(context, attrs);
}

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

    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.drawText(mPrefix, super.getCompoundPaddingLeft(), getBaseline(), getPaint());
}

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

}
Run Code Online (Sandbox Code Playgroud)

我这个类的xml调用如下,

<cl.dd.ui.PrefixedEditText
                    style="@style/edittext"
                    android:id="@+id/etCode"
                    android:maxLength="3"
                    android:drawableLeft="@drawable/icon_phone_number"
                    android:drawableStart="@drawable/icon_phone_number"
                    android:minWidth="@dimen/dim_img_width"
                    android:hint="@string/s_login_code"
                    android:tag="@string/s_login_country_code"
                    android:inputType="number"/>
Run Code Online (Sandbox Code Playgroud)

Mos*_*zar 5

您需要确保supportsRtl在您的AndroidManifest.xml

<application
    ...
    android:supportsRtl="true">
Run Code Online (Sandbox Code Playgroud)

如果您的目标是 SDK 17+,请设置layoutDirectionlocale,inheritrtl在您的布局 xml 中

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:layoutDirection="locale">
Run Code Online (Sandbox Code Playgroud)

如果您的目标 SDK 低于 17,您将不得不创建另一个 res 目录,例如layout-ldrtl或者values-ldrtl并且可能向您的自定义视图发送一个 rtl 标志。