我想知道是否有可能始终保持标签扩展,无论EditText
中是否有文本。我在源头环顾四周,它是在ValueAnimator
中使用counter
和TextWatcher
来制作或不制作动画变化。也许我可以在TextWatcher
内的ValueAnimator
上设置自定义EditText
和自定义TextInputLayout
?
当前版本的TextInputLayout
专门用于做一件事 - 根据EditText
中是否有一些文本显示/隐藏帮助器标签。你想要的是不同的行为,所以你需要一个不同于TextInputLayout
的小部件。这种情况是编写适合您需求的自定义视图的理想选择。
也就是说,你设置一个自定义TextWatcher
到EditText
的想法也不会起作用,因为TextInputLayout
没有暴露它真正处理动画的内部任何东西 - updateLabelVisibility()
,setEditText()
,做这项工作的魔法Handler
或其他任何东西。当然我们肯定不想去这样的细节的反射路径,所以......
只需使用MaterialEditText!它具有以下属性,可以完全满足您的需求。
met_floatingLabelAlwaysShown:始终显示浮动标签,而不是动画输入/输出。默认为False。
该库非常稳定(我自己在两个不同的项目中使用它)并且有很多自定义选项。希望能帮助到你!
对于支持设计23.3.0的我来说,它可以使用
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="wow such hint"
app:hintEnabled="true"
app:hintAnimationEnabled="false"
/>
尽管有最好的答案,我仍然只是想出了一个Java Reflection解决方案来实现所需的行为(使用来自com.google.android.material.textfield.TextInputLayout
的com.google.android.material:material:1.0.0
):
/**
* Creation Date: 3/20/19
*
* @author www.flx-apps.com
*/
public class CollapsedHintTextInputLayout extends TextInputLayout {
Method collapseHintMethod;
public CollapsedHintTextInputLayout(Context context) {
super(context);
init();
}
public CollapsedHintTextInputLayout(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public CollapsedHintTextInputLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
void init() {
setHintAnimationEnabled(false);
try {
collapseHintMethod = TextInputLayout.class.getDeclaredMethod("collapseHint", boolean.class);
collapseHintMethod.setAccessible(true);
}
catch (Exception ignored) {
ignored.printStackTrace();
}
}
@Override
public void invalidate() {
super.invalidate();
try {
collapseHintMethod.invoke(this, false);
}
catch (Exception e) {
e.printStackTrace();
}
}
}
Java Reflection当然永远不会漂亮,但在我的情况下,它只是比创建一个类似的外观小部件更方便的解决方案,并且链接的库似乎过时并被放弃......:/
如果您使用它,请不要忘记添加相应的ProGuard规则:
-keepclassmembers class com.google.android.material.textfield.TextInputLayout {
private void collapseHint;
}