4

У меня есть edittext с изображением как выталкиваемый слева с нередактируемым префиксом editext, но теперь я хотел сделать его для поддержки rtl. Несмотря на мои усилия, я не могу поддержать rtl.Поддержка RTL для пользовательских editext для выделенных левых

Мой заказ класс следующим образом,

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(); 
} 

} 

Мой 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"/> 
+0

ли вы попробовать это на API 17+ или ниже? –

+0

Да, но не работает. и в настоящее время он лечит его на marshmellow .. это хорошо с английским, но когда приложение открыто в арабском режиме, префикс не появился. – TheReprator

+0

попробуйте 'drawableEnd' или' drawableRight' и посмотрите, не изменится ли он автоматически. –

ответ

0

Вот что я могу предложить.

Вместо расширения TextInputEditText, создайте пользовательский вид на основе макета.

Компоновка может быть что-то вроде этого:

<RelativeLayout 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 

    <TextView 
     android:id="@+id/prefixTextView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentStart="true /> 

    <EditText 
     android:id="@+id/editText" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"  
     android:layout_toEndOf="@id/prefixTextView" /> 

</RelativeLayout> 

Затем, вы можете создать пользовательский вид, простирающийся RelativeLayout с этого макета. Он будет адаптироваться к изменениям языка.

Есть несколько недостатков: полученный результат не будет находиться в иерархии классов EditText, и использование его во многих местах может привести к ухудшению производительности пользовательского интерфейса, поскольку оно вводит вложенные макеты, но, по крайней мере, RTL часть будет в порядке.

+0

в любом случае спасибо, я знаю, как это сделать с помощью xml, но я хотел сделать это с помощью холста. – TheReprator

2

Вы должны убедиться, что supportsRtl установлена ​​истина в вашем AndroidManifest.xml

<application 
    ... 
    android:supportsRtl="true"> 

и установить layoutDirection в locale, inherit или rtl в макете XML, если вы ориентируетесь SDK 17+

<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"> 

Если ваш целевой SDK ниже 17, вам необходимо создать другой каталог res, например layout-ldrtl или values-ldrtl и возможно, отправьте флаг rtl в свой пользовательский вид.

+0

Я сделал это в своем макете и манифесте. – TheReprator

+0

Как вы меняете локализацию устройства, какова ваша настройка тестирования? Я пробовал на Android 5 эмулятор и Android N Nexus 6P с арабским, и он работал нормально. –

+0

Для целей отладки попробуйте принудительно настроить android: layoutDirection на rtl и посмотреть, работает ли он –

1

Для получения текста с предварительным префиксом с поддержкой локали просто создайте пользовательский текст редактирования и нарисуйте префикс как рисованный.

Направить фрагмент кода ниже:

/** 
    * Custom EditText that displays a fixed prefix in line with the text. 
    * The trick here is to draw the prefix as a drawable and attach it via 
    * setCompoundDrawables(). 
    */ 

    public class PrefixEditText extends AppCompatEditText { 

     private ColorStateList mPrefixTextColor; 

     public PrefixEditText(Context context) { 
      this(context, null); 
     } 

     public PrefixEditText(Context context, AttributeSet attrs) { 
      this(context, attrs, android.R.attr.editTextStyle); 
     } 

     public PrefixEditText(Context context, AttributeSet attrs, int defStyle) { 
      super(context, attrs, defStyle); 
      mPrefixTextColor = getTextColors(); 
     } 

     public void setPrefix(String prefix) { 
      if (Locale.getDefault().getLanguage().equalsIgnoreCase("en")) 
       setCompoundDrawables(new TextDrawable(prefix + " "), null, null, null); 
      else if (Locale.getDefault().getLanguage().equalsIgnoreCase("ar")) 
       setCompoundDrawables(null, null, new TextDrawable(" " + prefix), null); 
     } 

     public void setPrefixTextColor(int color) { 
      mPrefixTextColor = ColorStateList.valueOf(color); 
     } 

     private class TextDrawable extends Drawable { 
      private String mText = ""; 

      TextDrawable(String text) { 
       mText = text; 
       setBounds(0, 0, (int) getPaint().measureText(mText) + 3, (int) getTextSize()); 
      } 

      @Override 
      public void draw(Canvas canvas) { 
       Paint paint = getPaint(); 
       paint.setColor(mPrefixTextColor.getColorForState(getDrawableState(), 0)); 
       int lineBaseline = getLineBounds(0, null); 
       canvas.drawText(mText, 0, canvas.getClipBounds().top + lineBaseline, paint); 
      } 

      @Override 
      public void setAlpha(int alpha) {/* Not supported */} 

      @Override 
      public void setColorFilter(ColorFilter colorFilter) {/* Not supported */} 

      @Override 
      public int getOpacity() { 
       return 1; 
} 
} 
}