android – TextInputLayout标签,位于EditText的左侧drawable之上

用户在EditText中聚焦或键入时,是否可以使TextInputLayout标签垂直显示在EditText的左侧drawable上方.

这是EditText的xml:

<android.support.design.widget.TextInputLayout
                android:id="@+id/completion_date_layout2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="5dp"
                android:layout_marginRight="5dp"
                android:layout_weight="1"
                android:orientation="horizontal">

                <EditText
                    android:id="@+id/etTaskDate"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:hint="@string/title_completion_date"
                    android:inputType="text"
                    android:drawableLeft="@drawable/ic_date"
                    android:paddingBottom="15dp"
                    android:drawablePadding="5dp"
                    android:textSize="@dimen/fields_text_size"/>
            </android.support.design.widget.TextInputLayout>

这是所需的输出

这是我得到的输出

解决方法

感谢Java的成员访问模型和谷歌的开发人员留下了一个小漏洞,可以通过一个简单的子类来实现,它重复了最少的原始代码
package android.support.design.widget;

import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;

public final class TextInputLayoutEx extends TextInputLayout {

    private final int mDefaultPadding = __4DP__;
    private final Rect mTmpRect = new Rect();

    public TextInputLayoutEx(Context context,AttributeSet attrs) {
        super(context,attrs);
    }

    @Override
    protected void onLayout(boolean changed,int left,int top,int right,int bottom) {
        super.onLayout(changed,left,top,right,bottom);
        if (isHintEnabled() && mEditText != null) {
            final Rect rect = mTmpRect;
            ViewGroupUtils.getDescendantRect(this,mEditText,rect);
            mCollapsingTextHelper.setCollapsedBounds(
                rect.left + mDefaultPadding,getPaddingTop(),rect.right - mDefaultPadding,bottom - top - getPaddingBottom());
            mCollapsingTextHelper.recalculate();
        }
    }

}

在这里,我们将一个新类放到同一个包中,该类打开对包含级别可见性的mCollapsingTextHelper的访问,然后从管理字段名称定位的原始onLayout方法重复部分代码. __4DP__值是4dp值转换为像素,我很确定每个人都有一个实用方法.

在你的xml布局中,只需从android.support.design.widget.TextInputLayout切换到android.support.design.widget.TextInputLayoutEx,这样你的布局如下所示:

<android.support.design.widget.TextInputLayoutEx
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="Mobile">
    <android.support.design.widget.TextInputEditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:drawableLeft="@drawable/ic_phone_black_24dp"
        android:drawablePadding="4dp"/>
</android.support.design.widget.TextInputLayoutEx>

结果是

目前它适用于com.android.support:design:25.3.1

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...