如您所知,TextInputLayout
使用私有助手類來處理提示文本樣式和動畫。此類 - CollapsingTextHelper
- 爲其摺疊和展開狀態維護單獨的字體。我們只需要設置正確的,我們將使用反射。
我通常將這些類型的功能包裝到自定義子類中,所以我會在這裏做同樣的事情。如果你不想使用子類,反射的東西可以很容易地拉入一些簡單的方法,你可以把它放在你的Activity
或工具類。
public class CustomTextInputLayout extends TextInputLayout {
private Object collapsingTextHelper;
private Method setCollapsedTypefaceMethod;
private Method setExpandedTypefaceMethod;
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);
init();
}
private void init() {
try {
Field cthField = TextInputLayout.class
.getDeclaredField("mCollapsingTextHelper");
cthField.setAccessible(true);
collapsingTextHelper = cthField.get(this);
setCollapsedTypefaceMethod = collapsingTextHelper
.getClass().getDeclaredMethod("setCollapsedTypeface", Typeface.class);
setCollapsedTypefaceMethod.setAccessible(true);
setExpandedTypefaceMethod = collapsingTextHelper
.getClass().getDeclaredMethod("setExpandedTypeface", Typeface.class);
setExpandedTypefaceMethod.setAccessible(true);
}
catch (NoSuchFieldException | IllegalAccessException | NoSuchMethodException e) {
collapsingTextHelper = null;
setCollapsedTypefaceMethod = null;
setExpandedTypefaceMethod = null;
e.printStackTrace();
}
}
public void setCollapsedTypeface(Typeface typeface) {
if (collapsingTextHelper == null) {
return;
}
try {
setCollapsedTypefaceMethod.invoke(collapsingTextHelper, typeface);
}
catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
e.printStackTrace();
}
}
public void setExpandedTypeface(Typeface typeface) {
if (collapsingTextHelper == null) {
return;
}
try {
setExpandedTypefaceMethod.invoke(collapsingTextHelper, typeface);
}
catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
e.printStackTrace();
}
}
}
有點直覺相反,TextInputLayout
的摺疊狀態是當所述提示是EditText
上方的浮動標籤。它的擴展狀態是當提示是在「正常」的位置,內EditText
。上面給出了設置兩種狀態字體的方法。
這是對TextInputLayout
的直接替換,您可以像使用它那樣在佈局中使用它。例如:
<com.mycompany.myapp.CustomTextInputLayout
android:id="@+id/username_til"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:hintTextAppearance="@style/TextLabel">
<android.support.design.widget.TextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="24sp"
android:hint="Username" />
</com.mycompany.myapp.CustomTextInputLayout>
在代碼中,設置浮動文本提示的字體:
CustomTextInputLayout usernameTextInputLayout =
(CustomTextInputLayout) findViewById(R.id.username_til);
usernameTextInputLayout.setCollapsedTypeface(Utils.ROBOTO_BOLD_TYPE_FACE);
上面使用的CollapsingTextHelper
方法在支持的23.1.0版本中加入圖書館。如果您使用的是以前的版本,或者出於某種其他原因而獲得NoSuchMethodException
,則無論版本如何,直接設置字體字段的the original version of my answer都應該可以工作。
是的,這是可能的,但我很確定這將需要反思去做。我最近寫了一些自定義的'TextInputLayout'子類,而且,從我的頭頂開始,我想不出沒有反思的方法。如果這是可以接受的,我可以把東西放在一起。 –
我曾嘗試反射技術http://stackoverflow.com/a/30767869/72437它也會影響提示文本。 –
嗯,我相信它可以做到。給我一點點做一些測試。我會讓你知道的。 –