解决方法:
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会将提示向右移动所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)