2017-01-20 6 views
2

Wenn ich die folgende (Bug?):Android "android: input" überschreibt "android: digits", wenn Sie es nach dem Set "android: digits"

et_user_input.setKeyListener(DigitsKeyListener.getInstance("123-+")); 
et_user_input.setInputType((EditorInfo.TYPE_TEXT_VARIATION_NORMAL)); 

Einstellen der input zweiten überschreibt die Ziffern I angegeben. Dies ist ziemlich problematisch, da ich eine benutzerdefinierte zusammengesetzte Ansicht verwende und ich nicht steuern kann, in welcher Reihenfolge der Switch-Fall basierend auf den Attributen auslöst.

Hier ist ein kleiner Ausschnitt aus meinem Code:

public ValidationEditText(Context context, AttributeSet attrs) { 
    super(context, attrs); 

    TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.ValidationEditText); 
    int count = typedArray.getIndexCount(); 

    for (int i = 0; i < count; i++) { 
      int attr = typedArray.getIndex(i); 

      switch (attr) { 
       case R.styleable.ValidationEditText_android_inputType: 
        LogUtil.a(getClass(), "Here1"); 
        et_user_input.setInputType(typedArray.getInt(attr, EditorInfo.TYPE_TEXT_VARIATION_NORMAL)); 
        break; 

       case R.styleable.ValidationEditText_android_digits: 
        LogUtil.a(getClass(), "Here2"); 
        et_user_input.setKeyListener(DigitsKeyListener.getInstance(typedArray.getString(attr))); 
        break; 
      } 

     } 
} 

"Here2" löst immer zuerst von "here1 Motiv" in dem Schaltergehäuse gefolgt.

Ist dieser "übergeordnete" Effekt das gewünschte Verhalten von Android oder ist es tatsächlich ein Fehler?

Antwort

0

Gefundene Lösung, Problem war in Sache, dass DigitsKeyListener NumberKeyListener erweitert, die Nummer inputType zurückgibt. So ist die Lösung

public class CustomDigitsKeyListener extends NumberKeyListener { 

private char[] mAccepted; 

public CustomDigitsKeyListener(char[] mAccepted) { 
    this.mAccepted = mAccepted; 
} 

public CustomDigitsKeyListener() { 
} 

public static CustomDigitsKeyListener getInstance(String accepted){ 
    CustomDigitsKeyListener cust = new CustomDigitsKeyListener(); 
    cust.mAccepted = new char[accepted.length()]; 
    accepted.getChars(0, accepted.length(), cust.mAccepted, 0); 
    return cust; 
} 

@Override 
protected char[] getAcceptedChars() { 
    return mAccepted; 
} 

@Override 
public int getInputType() { 
    return InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS; 
} 
}