保持TextInputLayout始终聚焦或保持标签始终扩展

时间:2016-01-30 02:14:58

标签: android android-textinputlayout

我想知道无论EditText中是否有文字,是否可以始终保持标签的扩展。我在源代码中查看了一下,在ValueAnimator内使用counterTextWatcher来动画或不动画更改。也许我可以在TextWatcher内的ValueAnimator设置自定义EditText自定义TextInputLayout

5 个答案:

答案 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