2016-10-21 3 views
1

Ich versuche, die Tipp-Größe in TextInputLayout zu ändern, aber es funktioniert nicht wie gewünscht. Dies ist, was würde Ich mag zu erreichen:Wie ändere ich die Größe des EditText-Hinweises in TextInputLayout

Desired result


styles.xml

<style name="TextLabel" parent="TextAppearance.Design.Hint"> 
    <item name="android:textSize">44sp</item> 
</style> 

fragment.xml

<android.support.design.widget.TextInputLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    app:hintTextAppearance="@style/TextLabel" 
    android:hint="Password"> 

    <android.support.design.widget.TextInputEditText 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:textSize="24sp"/> 

</android.support.design.widget.TextInputLayout> 

Dieser Code funktioniert für das Floating-Label nur, wenn die EditText ist nicht leer, aber ich möchte cha nge die Tipp-Größe in der EditText selbst, wenn es leer ist.

Antwort

0

Die Größe des regulären Hinweistextes wird auf die Textgröße EditText eingestellt, wenn diese während der Inflation/Initialisierung zur TextInputLayout hinzugefügt wird. Dieser Wert wird letztendlich in einer privaten Hilfsklasse in TextInputLayout festgelegt, und es gibt keine öffentlich zugänglichen Methode oder Feld, um es zu ändern.

Allerdings können wir ein wenig mit den Textgrößen jonglieren, indem wir TextInputLayout ableiten, um das Hinzufügen des EditText abzufangen. Wenn die EditText hinzugefügt wird, speichern wir die Textgröße zwischen, setzen die gewünschte Hinweisgröße als Textgröße, erlauben der Superklasse, sie hinzuzufügen und den Hinweis zu initialisieren, und setzen schließlich die Textgröße EditText auf ihren ursprünglichen Wert zurück.

Zum Beispiel:

public class CustomTextInputLayout extends TextInputLayout { 

    private float mainHintTextSize; 
    private float editTextSize; 

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

    public CustomTextInputLayout(Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 

    public CustomTextInputLayout(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 

     TypedArray a = context.obtainStyledAttributes(
      attrs, R.styleable.CustomTextInputLayout); 

     mainHintTextSize = a.getDimensionPixelSize(
      R.styleable.CustomTextInputLayout_mainHintTextSize, 0); 

     a.recycle(); 
    } 

    @Override 
    public void addView(View child, int index, ViewGroup.LayoutParams params) { 
     final boolean b = child instanceof EditText && mainHintTextSize > 0; 

     if (b) { 
      final EditText e = (EditText) child; 
      editTextSize = e.getTextSize(); 
      e.setTextSize(TypedValue.COMPLEX_UNIT_PX, mainHintTextSize); 
     } 

     super.addView(child, index, params); 

     if (b) { 
      getEditText().setTextSize(TypedValue.COMPLEX_UNIT_PX, editTextSize); 
     } 
    } 

    // Units are pixels. 

    public float getMainHintTextSize() { 
     return mainHintTextSize; 
    } 

    // This optional method allows for dynamic instantiation of this class and 
    // its EditText, but it cannot be used after the EditText has been added. 
    // Units are scaled pixels. 

    public void setMainHintTextSize(float size) { 
     if (getEditText() != null) { 
      throw new IllegalStateException(
       "Hint text size must be set before EditText is added"); 
     } 

     mainHintTextSize = TypedValue.applyDimension(
      TypedValue.COMPLEX_UNIT_SP, size, getResources().getDisplayMetrics()); 
    } 
} 

So verwenden Sie das benutzerdefinierte mainHintTextSize Attribut, müssen wir folgend in unserem <resources>, die wir nur durch Kleben Sie die folgende Datei in dem Ordner res/values/ oder das Hinzufügen zu der tun können, eine, die schon da ist.

attrs.xml

<resources> 
    <declare-styleable name="CustomTextInputLayout" > 
     <attr name="mainHintTextSize" format="dimension" /> 
    </declare-styleable> 
</resources> 

Wenn Sie das benutzerdefinierte Attribut zu verwenden, ist es egal, können Sie diese Datei überspringen und entfernen Sie über die TypedArray Verarbeitung im dritten Konstruktor.

Diese benutzerdefinierte Klasse ist ein Drop-In-Ersatz für TextInputLayout und kann genau so verwendet werden, wie sie wäre. Zum Beispiel:

<com.mycompany.myapp.CustomTextInputLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:hint="Password" 
    app:hintTextAppearance="@style/TextLabel" 
    app:mainHintTextSize="12sp"> 

    <android.support.design.widget.TextInputEditText 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:textSize="24sp" 
     android:text="qwerty123" /> 

</com.mycompany.myapp.CustomTextInputLayout> 

screenshot


Leider diese Methode verwenden, kann der Hinweistext Größe nicht geändert werden, nachdem die EditText hinzugefügt wurde. Das würde Nachdenken erfordern, und ich habe eine solche Lösung bei Bedarf verfügbar.

+1

Perfekt. Ich danke dir sehr! – Stanis

Verwandte Themen