测量 TextInputLayout 错误容器的高度

Measure height of TextInputLayout error container

您好,我必须按如下所示进行布局,编辑文本必须在 TextInputLayout 中才能具有错误和浮动提示功能,并且右侧的微调器必须具有下划线。我的问题是如何做到这一点,因为当我将 EditText 添加到 TextInputLayout 时,下面有一个填充波纹管,并且两个下划线不在同一行中。是否有可能以某种方式测量这个错误容器的高度?

所以有两种可能性:

  1. errorEnabled 设置为 false 并使用错误文本创建自定义 TextView
  2. 在第二个视图的底部添加额外的不可见 TextView,其样式和字体大小可以在 TextInputLayout 构造函数中找到。我没有使用这种方法,但在我的情况下它是 12sp。

这是一个常见问题,也是我前几天不得不自己处理的问题。您可以随时查看 guidelines here 上的测量值,而无需查看代码。

关于制作微调器匹配,您可以从添加像这样的可绘制背景开始

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:top="-1dp"
        android:left="-1dp"
        android:right="-1dp"
        android:bottom="1dp" >
        <shape android:shape="rectangle">
            <padding android:top="4dp" android:bottom="4dp" />
            <stroke android:width="1dp" android:color="@color/my_grey"/>
        </shape>
    </item>
</layer-list>

您可能希望将 android:padding="0dp" 添加到 Spinner,而不是使用其中一种 simple_... 布局,它添加了与 EditText 不匹配的填充,return 一个普通的 TextView作为您从适配器 return 编辑的视图,但继续为下拉视图使用 simple_... 布局,如下面的适配器示例

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        //convertView = mInflater.inflate(R.layout.support_simple_spinner_dropdown_item, parent, false);
        convertView = new TextView(parent.getContext());
    }
    //if you want to mimick the floating hint behaviour from the edit text,      
    //you can animate the label visibility here
    return populateView(position, convertView, parent);
}

private View populateView(int position, View convertView, ViewGroup parent) {
    // in here set your values as you usually would
    return convertView;
}

@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.support_simple_spinner_dropdown_item, parent, false);
    }
    return populateView(position, convertView, parent);
}

现在,只要您在 EditText 和 Spinner 上的边距匹配,它们就会对齐。尽管在某些布局中我必须在 Spinner

上设置 android:layout_marginTop="0dp"