android– 如果edittext在TextInputlayout中,则将一个drawableLeft添加到EditText会将提示向右移动

android– 如果edittext在TextInputlayout中,则将一个drawableLeft添加到EditText会将提示向右移动,第1张

概述I我在TextInputLayout中创建了一个EditText.我在运行时在我的代码中将drawableLeft设置为EditText,但是一旦我添加了drawableLeft,TextInputLayout中的浮动提示就会向右移动,使空间等于drawable宽度.但我不希望这个空间暗示,所以帮我解决这个问题!解决方法:TextInputLayout使用辅助

I我在TextinputLayout中创建了一个EditText.我在运行时在我的代码中将drawableleft设置为EditText,但是一旦我添加了drawableleft,TextinputLayout中的浮动提示就会向右移动,使空间等于drawable宽度.但我不希望这个空间暗示,所以帮我解决这个问题!

解决方法:

TextinputLayout使用辅助类 – CollapsingTextHelper – 来 *** 作其提示文本.这个帮助器的实例是私有的,并且没有公开与其布局相关的任何属性,因此我们需要使用一点反射来访问它.此外,每次布置TextinputLayout时都会设置和重新计算其属性,因此将TextinputLayout子类化,覆盖其onLayout()方法并在那里进行调整是有意义的.

import androID.content.Context;import androID.graphics.Rect;import androID.support.design.Widget.TextinputLayout;import androID.util.AttributeSet;import java.lang.reflect.FIEld;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;public class CustomTextinputLayout extends TextinputLayout {    private Object collapsingTextHelper;    private Rect bounds;    private Method recalculateMethod;    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();    }    @OverrIDe    protected voID onLayout(boolean changed, int left, int top, int right, int bottom) {        super.onLayout(changed, left, top, right, bottom);        adjustBounds();    }    private voID init() {        try {            FIEld cthFIEld = TextinputLayout.class.getDeclaredFIEld("mCollapsingTextHelper");            cthFIEld.setAccessible(true);            collapsingTextHelper = cthFIEld.get(this);            FIEld boundsFIEld = collapsingTextHelper.getClass().getDeclaredFIEld("mCollapsedBounds");            boundsFIEld.setAccessible(true);            bounds = (Rect) boundsFIEld.get(collapsingTextHelper);            recalculateMethod = collapsingTextHelper.getClass().getDeclaredMethod("recalculate");        }        catch (NoSuchFIEldException | illegalaccessexception | NoSuchMethodException e) {            collapsingTextHelper = null;            bounds = null;            recalculateMethod = null;            e.printstacktrace();        }    }    private voID adjustBounds() {        if (collapsingTextHelper == null) {            return;        }        try {            bounds.left = getEditText().getleft() + getEditText().getpaddingleft();            recalculateMethod.invoke(collapsingTextHelper);        }        catch (InvocationTargetException | illegalaccessexception | IllegalArgumentException e) {            e.printstacktrace();        }    }}

此自定义类是常规TextinputLayout的替代品,您可以使用相同的方式.例如:

<com.mycompany.myapp.CustomTextinputLayout    androID:ID="@+ID/text_input_layout"    androID:layout_wIDth="match_parent"    androID:layout_height="wrap_content"    androID:hint="Model (Example i10, Swift, etc.)"    app:hintTextAppearance="@style/TextLabel">    <androID.support.design.Widget.TextinputEditText        androID:ID="@+ID/edit_text"        androID:layout_wIDth="match_parent"        androID:layout_height="wrap_content"        androID:drawableleft="@drawable/bmw"        androID:text="M SerIEs" /></com.mycompany.myapp.CustomTextinputLayout>

笔记:

>在移动到Material Components库时,辅助类和边界的字段名称已删除了m前缀表示法.如评论中所述,它们现在分别命名为collapsingTextHelper和collapsedBounds.
>从API级别28(PIE)开始,有一些Restrictions on non-SDK interfaces(包括反射)可以访问SDK中通常无法访问的成员.但是,各种可用文档似乎表明不禁止对您自己的包中的组件进行反射.由于支持库不是平台SDK的一部分,并且在构建时合并到您的包中,因此该解决方案应该仍然有效.实际上,最近的测试没有发现问题,这仍然可以在可用的PIE仿真器上运行.

总结

以上是内存溢出为你收集整理的android – 如果edittext在TextInputlayout中,则将一个drawableLeft添加到EditText会将提示向右移动全部内容,希望文章能够帮你解决android – 如果edittext在TextInputlayout中,则将一个drawableLeft添加到EditText会将提示向右移动所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1103732.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存