9

当用户聚焦或键入 EditText 时,是否可以使 TextInputLayout 标签垂直显示在 EditText 的左侧可绘制对象上方。

这是 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>

这是所需的输出:

在此处输入图像描述

这是我得到的输出:

在此处输入图像描述

4

4 回答 4

8

感谢 Java 的成员访问模型和留下了一个小漏洞的 Google 开发人员,它可以通过一个简单的子类来实现,该子类重复最少的原始代码:

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.TextInputLayoutandroid.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

于 2017-08-04T16:15:21.420 回答
0

您可以使用动画和 frame_layout 为左侧图标设置动画,试试这个链接,可能对您有所帮助。

于 2016-06-08T10:13:26.640 回答
0

你可以试试这个自定义类:在这里找到

然后只需更改 xml

com.mycompany.myapp.CustomTextInputLayout

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();
        }
    }
}
于 2018-07-11T11:01:24.083 回答
0

我已经针对这个问题做了一个解决方法。这可能有点不可靠,但它对我有用。这是代码:

String spacer="        ";
EditText myEditText= (EditText)findViewById(R.id.myEditText);
myEditText.setText(spacer + "Today");
myEditText.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_calendar, 0, 0, 0);

我在这里所做的是在editText 内的文本之前放置一个分隔符,然后以编程方式添加可绘制的左侧。

但请确保在获取 editText 的内容之前删除这些空格:

String title = myEditText.getText().toString().substring(8);

这意味着我在“今天”这个词之前裁剪了 8 个空格。

于 2016-03-01T19:14:28.147 回答