1

Недавно я обновил библиотеку Android Design с 24.2.1 до 25.0.0. После этого функция «drawableX» в EditText не работает.Невозможно использовать drawable в EditText внутри TextInputLayout

EDIT 01.11: Я узнал, что настройка drawable в xml работает, если вы используете android: drawableStart вместо android: drawableLeft. Но программная настройка параметров установки не работает. Я использую это, чтобы создать кнопку «Очистить», чтобы очистить EditText. Но эта функция сейчас нарушена. Я был бы признателен за любые обходы или знания о том, является ли это преднамеренным от Google или ошибка!

Мой код для Устраняемые редактирования-текста, который работал раньше, но теперь не:

public class ClearableErrorTextInputEditText extends ErrorTextInputEditText implements View.OnFocusChangeListener, View.OnTouchListener, TextWatcher { 

private Drawable resIcon; 
private OnFocusChangeListener childFocusListener; 

public ClearableErrorTextInputEditText(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    setup(); 
} 

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

public ClearableErrorTextInputEditText(Context context) { 
    super(context); 
    setup(); 
} 

@Override 
public boolean onTouch(View v, MotionEvent event) { 
    if (event.getAction() == MotionEvent.ACTION_UP) { 
     if (getCompoundDrawables()[2] != null) { 
      final boolean tappedClose = event.getX() > (getWidth() - getPaddingRight() - resIcon.getIntrinsicWidth()); 
      if (tappedClose) { 
       setText(""); 
       return false; // true will fail on emulator running 2.1 and physical keyboard/scroll wheel 
      } 
     } 
    } 
    return false; 
} 

@Override 
public void setOnFocusChangeListener(OnFocusChangeListener l) { 
    childFocusListener = l; 
} 

@Override 
public void onFocusChange(View v, boolean hasFocus) { 
    setClearIconVisible(hasFocus && getText().length() > 0); 

    if (childFocusListener!=null){ 
     childFocusListener.onFocusChange(v, hasFocus); 
    } 
} 

@Override 
public void onTextChanged(CharSequence s, int start, int before, int count){ 
    super.onTextChanged(s, start, before, count); 
    setClearIconVisible(isFocused() && s.length() > 0); 
} 

@Override 
public void beforeTextChanged(CharSequence s, int start, int count, int after) {} // not interesting 

@Override 
public void afterTextChanged(Editable s) {} // // not interesting 

private void setup() { 
    if(isInEditMode()){ 
     return; 
    } 

    resIcon = getResources().getDrawable(R.drawable.ic_clear, null); 
    resIcon.setBounds(0, 0, resIcon.getIntrinsicWidth(), resIcon.getIntrinsicHeight()); 

    setClearIconVisible(false); 

    super.setOnTouchListener(this); 
    super.setOnFocusChangeListener(this); 
    addTextChangedListener(this); 
} 

private void setClearIconVisible(final boolean visible){ 
    final Drawable icon = visible ? resIcon : null; 
    setCompoundDrawables(getCompoundDrawables()[0], 
      getCompoundDrawables()[1], icon, getCompoundDrawables()[3]); 
} 

ответ

1

На основании ответа Ахмед Ашраф G, я был в состоянии найти решение. Изменение следующего кода:

setCompoundDrawables(getCompoundDrawables()[0], 
     getCompoundDrawables()[1], icon, getCompoundDrawables()[3]); 

к:

setCompoundDrawablesRelative(getCompoundDrawablesRelative()[0], 
      getCompoundDrawablesRelative()[1], icon, getCompoundDrawablesRelative()[3]); 

Из других мест на StackOverflow (документация не упоминает об этом) разнице между xxxCompoundDrawablesXxx и xxxCompundDrawablesRelativeXxx является то, что относительные версии учитывают RTL -языки, т. е. они аналогичны использованию drawableStart вместо drawableLeft.

Итак, в результате Google нарушил все методы, которые не являются RTL-методами для EditText внутри TextInputLayout. Поскольку новые методы добавлены в уровне API 17, я рассматриваю это как серьезную ошибку, которая, вероятно, будет исправлена ​​в будущих обновлениях

4

У меня был точно такой же вопрос, все, что я сделал добавить drawableStart вместе с drawableLeft и показал, как ожидалось.

+0

Это сработало при добавлении чертежей в xml! – Gober

+0

Yup, это странно, но drawableLeft не должен зависеть от drawableStart, вероятно, ошибка. –

+0

Но моя реальная проблема в том, что я хочу сделать это программно, поскольку я показываю и скрываю ясный значок, если есть текст или нет. Я использую setCompoundDrawables(), и это ничего не показывает (это было до этого) – Gober

0

попытка заменить EditText на android.support.design.widget.TextInputEditText, например:

<android.support.design.widget.TextInputLayout 
    android:id="@+id/email_input" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

<android.support.design.widget.TextInputEditText 
      android:id="@+id/email" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:hint="@string/email_hint" 
      android:drawableStart="@drawable/ic_clear" /> 
</android.support.design.widget.TextInputLayout> 
+0

Это приводит к следующей ошибке: Элемент TextInputEditText здесь не разрешен. Также в xml выполняется решение, данное Ахмедом Ашрафом (используйте drawableStart). – Gober

Смежные вопросы