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>
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.
Perfekt. Ich danke dir sehr! – Stanis