我想知道无论EditText
中是否有文字,是否可以始终保持标签的扩展。我在源代码中查看了一下,在ValueAnimator
内使用counter
和TextWatcher
来动画或不动画更改。也许我可以在TextWatcher
内的ValueAnimator
设置自定义EditText
自定义TextInputLayout
?
答案 0 :(得分:8)
TextInputLayout
的当前版本专门用于做一件事 - 显示/隐藏帮助器标签,具体取决于EditText
中是否有某些文本。您想要的是不同的行为,因此您需要一个与TextInputLayout
不同的小部件。这种情况是编写适合您需求的自定义视图的理想选择。
也就是说,您将自定义TextWatcher
设置为EditText
的想法也不会起作用,因为TextInputLayout
没有公开其实际处理动画的内部内容 - 既不会updateLabelVisibility()
,setEditText()
,执行工作的魔法Handler
或其他任何内容。当然我们肯定不想去这样的细节的反射路径,所以......
只需使用MaterialEditText!它具有以下属性,可以完全满足您的需求。
met_floatingLabelAlwaysShown :始终显示浮动标签,而不是动画输入/输出。默认为False。
库非常稳定(我自己在两个不同的项目中使用它)并且有很多自定义选项。希望能帮助到你!
答案 1 :(得分:7)
对于支持设计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"
/>
答案 2 :(得分:1)
尽管答案是最重要的,我仍然只是想出一种Java反射解决方案来实现所需的行为(使用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反射当然从来都不是很漂亮,但就我而言,它只是比创建类似外观的小部件更方便的解决方案,而且链接库似乎已经过时和被抛弃了……:/
如果使用它,别忘了添加相应的ProGuard规则:
-keepclassmembers class com.google.android.material.textfield.TextInputLayout {
private void collapseHint;
}
答案 3 :(得分:1)
这是您可以使用的技巧,可让您将标签提示放置在布局中,将文本框提示放置在edittext中,而不会发生冲突。它将比上面的反射解决方案更好地工作,因为它可以进行原始的比较,从而避免了原始不良图形的发生,并且不需要您解决最小化/常规设置。
子类TextInputEditText如下:
import android.content.Context
import android.text.Editable
import android.text.SpannableStringBuilder
import android.util.AttributeSet
import com.google.android.material.R
import com.google.android.material.textfield.TextInputEditText
import com.google.android.material.textfield.TextInputLayout
class MonkeyedTextInputEditText @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = R.attr.editTextStyle) : TextInputEditText(context, attrs, defStyleAttr) {
@Override
override fun getText(): Editable? {
val text = super.getText()
if (!text.isNullOrEmpty())
return text
/* We want this expression in TextInputLayout.java to be true if there's a hint set:
* final boolean hasText = editText != null && !TextUtils.isEmpty(editText.getText());
* But for everyone else it should return the real value, so we check the caller.
*/
if (!hint.isNullOrEmpty() && Thread.currentThread().stackTrace[3].className == TextInputLayout::class.qualifiedName)
return SpannableStringBuilder(hint)
return text
}
}
然后您的布局如下所示:
<com.google.android.material.textfield.TextInputLayout
...
android:hint="YOUR LABEL TEXT"
...
>
<yourapp.MonkeyedTextInputEditText
...
android:hint="YOUR PLACEHOLDER TEXT"
...
/>
</com.google.android.material.textfield.TextInputLayout>
答案 4 :(得分:0)
新属性 app:expandedHintEnabled
(自 1.3.0 起)无需子类化和其他技巧即可解决此问题。
https://github.com/material-components/material-components-android/issues/810