TextInputLayout和AutoCompleteTextView

时间:2016-09-10 23:08:35

标签: android autocomplete android-edittext

我在Android应用中使用TextInputLayout来为我的输入字段实现整洁的浮动标签效果。我知道我应该使用TextInputEditText来允许在横向模式下显示提示并且输入填满整个屏幕。

然而,在我的一些输入字段中,我使用AutoCompleteTextView进行自动完成(IMO的名称确实不一致 - “TextView”而不是“EditText” - 但这是另一个故事)显然直接从EditText继承。因此,它与TextInputEditText带来的功能不同。

所以我想知道是否有办法实现相同的hint-in-landscape功能(没有制作我自己的TextInputAutoCompleteTextView实现,也就是避免产生的lint警告)。我在这里错过了什么吗?我想我得到的是他们没有针对这个特定事物制作EditText的所有直接和间接子类的自定义版本,所以我希望自己创建吗?

7 个答案:

答案 0 :(得分:28)

有点晚了,但是,是的,你必须推出自己的实现。好消息是,这是相当简单的。以下是pGNSI的实施方式:

https://android.googlesource.com/platform/frameworks/support.git/+/master/design/src/android/support/design/widget/TextInputEditText.java

因此,TextInputEditText可能是这样的。

TextInputAutoCompleteTextView

答案 1 :(得分:6)

建立国际象棋的答案,我想我会更详细地介绍如何将自动填充功能与项目提示结合起来。以下是我使用它的确切步骤:

1)确保您的gradle依赖项中有implementation 'com.android.support:design:26.1.0'。确切的包名称会略有不同,具体取决于您的SDK版本。

2)从@ chessdork的答案中复制TextInputAutoCompleteTextView课程,并将其放入项目中的公共课程中。

3)将自动填充edittext放在XML布局中的位置。它的结构应该是这样的:

        <android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:paddingBottom="16dp">
        <mycompany.views.TextInputAutoCompleteTextView
            android:id="@+id/myAutoFill"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/myHint"/>
        </android.support.design.widget.TextInputLayout>

答案 2 :(得分:2)

现在,借助AndroidX,您无需自定义某些内容。只需添加材料组件样式

<com.google.android.material.textfield.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="Example TextInputLayout">

    <androidx.appcompat.widget.AppCompatAutoCompleteTextView
    style="@style/Widget.MaterialComponents.AutoCompleteTextView.FilledBox"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

</com.google.android.material.textfield.TextInputLayout> 

答案 3 :(得分:1)

两个答案(@chessdork和@Shn_Android_Dev)都有助于实现TextInputLayout(TIL)内AutoCompleteTextView(ACTV)的正确行为,但是我发现TIL的开头/结尾与ACTV之间没有空格。如下图所示:

Example of how there is no space between the ACTV and the TIL

我要解决的问题是在TextInputAutoCompleteTextView的开头和结尾添加几个填充值,对我有用的值为开头的12dp和结尾的8dp,但是当然您可以使用它并获得想要的效果。以@Shn_Android_Dev为例,TextInputAutoCompleteTextView最终将显示为:

<mycompany.views.TextInputAutoCompleteTextView
    android:id="@+id/myAutoFill"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingStart="12dp"
    android:paddingEnd="8dp"
    android:hint="@string/myHint"/>

现在视图如下:

Example with the correct spacing

答案 4 :(得分:1)

使用Material Components library,只需使用具有 Widget.MaterialComponents.TextInputLayout.*.ExposedDropdownMenu 样式的TextInputLayout

类似的东西:

  <com.google.android.material.textfield.TextInputLayout
style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox.ExposedDropdownMenu"
     android:hint="Hint..."
     ...>

       <AutoCompleteTextView
           android:background="@null"
           .../>

  </com.google.android.material.textfield.TextInputLayout>

enter image description here

答案 5 :(得分:0)

也许有人需要Xamarin Android实现的代码。

这里

namespace YourNamespace
{
    public class TextInputAutoCompleteTextView : AppCompatAutoCompleteTextView
    {
        public TextInputAutoCompleteTextView(Context context) : base(context)
        {
        }

        public TextInputAutoCompleteTextView(Context context, IAttributeSet attrs) : base(context, attrs)
        {
        }

        public TextInputAutoCompleteTextView(Context context, IAttributeSet attrs, int defStyleAttr) : base(context,
            attrs, defStyleAttr)
        {
        }

        public override IInputConnection OnCreateInputConnection(EditorInfo outAttrs)
        {
            IInputConnection ic = base.OnCreateInputConnection(outAttrs);
            if (ic != null && outAttrs.HintText == null)
            {
                IViewParent parent = Parent;
                if (parent is TextInputLayout layout)
                {
                    outAttrs.HintText = new Java.Lang.String(layout.Hint);
                }
            }

            return ic;
        }
    }
}

在Xml中...

    <android.support.design.widget.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <YourNamespace.TextInputAutoCompleteTextView
            android:id="@+id/edtDescription"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="Movements"
            android:inputType="textCapSentences" />

    </android.support.design.widget.TextInputLayout>

答案 6 :(得分:0)

简单的解决方案是将EditText转换为AutoCompleteTextView

XML

<com.google.android.material.textfield.TextInputLayout
    android:id="@+id/textInputLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"   
    <AutoCompleteTextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</com.google.android.material.textfield.TextInputLayout>

Java

AutoCompleteTextView autoCompleteTextView;
TextInputLayout textInputLayout = findViewById(R.id.textInputLayout);
autoCompleteTextView = (AutoCompleteTextView) textInputLayout.getEditText();