1

Ich habe kürzlich Android Design-Bibliothek von 24.2.1 auf 25.0.0 aktualisiert. Danach funktioniert die "DrawableX" -Funktion in EditText nicht.Kann nicht in EditText in TextInputLayout verwendet werden

EDIT 01.11: Ich habe gelernt, dass Einstellung in Xml funktioniert, wenn Sie Android: DrawableStart anstelle von Android: DrawableLeft. Das programmatische Einstellen von Einstellungen funktioniert jedoch nicht. Ich benutze dies um einen "Clear" -Button zu machen, um den EditText zu leeren. Aber diese Funktion ist jetzt kaputt. Ich würde mich über jegliche Umgehung oder Kenntnis darüber freuen, ob dies von Google oder einem Bug beabsichtigt ist!

Mein Code für Ignorierbare edit-Text, der vor gearbeitet, aber nicht jetzt:

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

Antwort

1

Basierend auf der Antwort von Ahmed Ashraf G, ich war in der Lage, die Lösung zu finden. Ändern Sie den folgenden Code:

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

zu:

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

Von anderen Orten auf Stackoverflow (die Dokumentation dieses nicht erwähnt) die Differenz zwischen xxxCompoundDrawablesXxx und xxxCompundDrawablesRelativeXxx ist, dass die relativen Versionen Rechnung RTL nehmen -Sprachen, dh sie sind identisch mit der Verwendung von drawableStart anstelle von drawableLeft.

Also zum Schluss, Google hat alle Methoden, die nicht RTL-Methoden für EditText in TextInputLayout sind gebrochen. Da die neuen Methoden in API-Level 17 hinzugefügt werden, sehe ich dies als Hauptfehler, der wahrscheinlich in zukünftigen Updates behoben wird.

4

ich genau das gleiche Problem hatte, Alles, was ich war drawableStart zusammen mit drawableLeft hinzufügen tat und es wie erwartet wird gezeigt.

+0

Dies funktionierte, wenn Sie Zeichnungsdateien in XML hinzufügen! – Gober

+0

Yup, es ist seltsam, DrawableLeft sollte nicht von DrawableStart abhängig sein, wahrscheinlich ein Bug. –

+0

Aber mein wirkliches Problem ist, dass ich es programmatisch machen will, da ich das Clear-Icon zeige und verstecke, wenn Text vorhanden ist oder nicht. Ich benutze setCompoundDrawables(), und das zeigt nichts (es tat vorher) – Gober

0

try EditText durch android.support.design.widget.TextInputEditText, zum Beispiel ersetzt:

<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

Dies gibt den folgenden Fehler: Element TextInputEditText ist hier nicht erlaubt. Auch in xml funktioniert die Lösung von Ahmed Ashraf (mit drawableStart). – Gober

Verwandte Themen