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

问题描述 投票:15回答:3

我想知道是否有可能始终保持标签扩展,无论EditText中是否有文本。我在源头环顾四周,它是在ValueAnimator中使用counterTextWatcher来制作或不制作动画变化。也许我可以在TextWatcher内的ValueAnimator上设置自定义EditText和自定义TextInputLayout

android android-textinputlayout
3个回答
8
投票

当前版本的TextInputLayout专门用于做一件事 - 根据EditText中是否有一些文本显示/隐藏帮助器标签。你想要的是不同的行为,所以你需要一个不同于TextInputLayout的小部件。这种情况是编写适合您需求的自定义视图的理想选择。

也就是说,你设置一个自定义TextWatcherEditText的想法也不会起作用,因为TextInputLayout没有暴露它真正处理动画的内部任何东西 - updateLabelVisibility()setEditText(),做这项工作的魔法Handler或其他任何东西。当然我们肯定不想去这样的细节的反射路径,所以......

只需使用MaterialEditText!它具有以下属性,可以完全满足您的需求。

met_floatingLabelAlwaysShown:始终显示浮动标签,而不是动画输入/输出。默认为False。

该库非常稳定(我自己在两个不同的项目中使用它)并且有很多自定义选项。希望能帮助到你!


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"
              />

1
投票

尽管有最好的答案,我仍然只是想出了一个Java Reflection解决方案来实现所需的行为(使用来自com.google.android.material.textfield.TextInputLayoutcom.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;
}
© www.soinside.com 2019 - 2024. All rights reserved.