TextInputLayout 和 AutoCompleteTextView
TextInputLayout and AutoCompleteTextView
我也在使用 TextInputLayout
in my Android app to achieve that neat floating label effect for my input fields. I know that I should be using the TextInputEditText
以允许在横向模式下显示提示并且输入填满整个屏幕。
然而,在我的一些输入字段中,我使用 AutoCompleteTextView
进行了自动完成(IMO 的名称非常不一致——“TextView”而不是“EditText”——但那是另一回事了)这显然直接继承自 EditText
。因此它没有 TextInputEditText
带来的相同功能。
所以我想知道是否有一种方法可以实现相同的横向提示功能(即无需我自己的 TextInputAutoCompleteTextView
实现)并避免生成的 lint 警告。我在这里错过了什么吗?我想我知道他们没有为这个特定的东西制作 EditText
的所有直接和间接子类的自定义版本,所以我应该自己制作吗?
有点晚了,但是是的,您必须推出自己的实施。好消息是这相当简单。以下是 TextInputEditText
的实施方式:
因此,这就是 TextInputAutoCompleteTextView
的样子。
public class TextInputAutoCompleteTextView extends AppCompatAutoCompleteTextView {
public TextInputAutoCompleteTextView(Context context) {
super(context);
}
public TextInputAutoCompleteTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public TextInputAutoCompleteTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
final InputConnection ic = super.onCreateInputConnection(outAttrs);
if (ic != null && outAttrs.hintText == null) {
// If we don't have a hint and our parent is a TextInputLayout, use it's hint for the
// EditorInfo. This allows us to display a hint in 'extract mode'.
final ViewParent parent = getParent();
if (parent instanceof TextInputLayout) {
outAttrs.hintText = ((TextInputLayout) parent).getHint();
}
}
return ic;
}
}
根据 chessdork 的回答,我想我会更详细地介绍如何将带有提示的自动填充合并到您的项目中。以下是我用来让它工作的确切步骤:
1) 确保您的 gradle 依赖项中有 implementation 'com.android.support:design:26.1.0'
。确切的包名称根据您的 SDK 版本略有不同。
2) 从@chessdork 的答案中复制 TextInputAutoCompleteTextView
class 并将其放入项目中的 public class。
3) 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>
这两个答案(@chessdork 和@Shn_Android_Dev)有助于在 TextInputLayout (TIL) 中实现 AutoCompleteTextView (ACTV) 的正确行为,但是我发现两者之间没有 space TIL 的 start/end 和其中的 ACTV,如下图所示:
我为解决这个问题所做的是在 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"/>
现在的视图如下所示:
也许有人需要 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>
现在,有了 AndroidX,您不需要自定义任何东西。
只需要添加 material 组件样式(在 1.1.0-alpha06
中添加,参见 release notes)。
<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>
Material Components library just use a TextInputLayout
Widget.MaterialComponents.TextInputLayout.*.ExposedDropdownMenu
风格。
类似于:
<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>
简单的解决方案是将 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();
我也在使用 TextInputLayout
in my Android app to achieve that neat floating label effect for my input fields. I know that I should be using the TextInputEditText
以允许在横向模式下显示提示并且输入填满整个屏幕。
然而,在我的一些输入字段中,我使用 AutoCompleteTextView
进行了自动完成(IMO 的名称非常不一致——“TextView”而不是“EditText”——但那是另一回事了)这显然直接继承自 EditText
。因此它没有 TextInputEditText
带来的相同功能。
所以我想知道是否有一种方法可以实现相同的横向提示功能(即无需我自己的 TextInputAutoCompleteTextView
实现)并避免生成的 lint 警告。我在这里错过了什么吗?我想我知道他们没有为这个特定的东西制作 EditText
的所有直接和间接子类的自定义版本,所以我应该自己制作吗?
有点晚了,但是是的,您必须推出自己的实施。好消息是这相当简单。以下是 TextInputEditText
的实施方式:
因此,这就是 TextInputAutoCompleteTextView
的样子。
public class TextInputAutoCompleteTextView extends AppCompatAutoCompleteTextView {
public TextInputAutoCompleteTextView(Context context) {
super(context);
}
public TextInputAutoCompleteTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public TextInputAutoCompleteTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
final InputConnection ic = super.onCreateInputConnection(outAttrs);
if (ic != null && outAttrs.hintText == null) {
// If we don't have a hint and our parent is a TextInputLayout, use it's hint for the
// EditorInfo. This allows us to display a hint in 'extract mode'.
final ViewParent parent = getParent();
if (parent instanceof TextInputLayout) {
outAttrs.hintText = ((TextInputLayout) parent).getHint();
}
}
return ic;
}
}
根据 chessdork 的回答,我想我会更详细地介绍如何将带有提示的自动填充合并到您的项目中。以下是我用来让它工作的确切步骤:
1) 确保您的 gradle 依赖项中有 implementation 'com.android.support:design:26.1.0'
。确切的包名称根据您的 SDK 版本略有不同。
2) 从@chessdork 的答案中复制 TextInputAutoCompleteTextView
class 并将其放入项目中的 public class。
3) 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>
这两个答案(@chessdork 和@Shn_Android_Dev)有助于在 TextInputLayout (TIL) 中实现 AutoCompleteTextView (ACTV) 的正确行为,但是我发现两者之间没有 space TIL 的 start/end 和其中的 ACTV,如下图所示:
我为解决这个问题所做的是在 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"/>
现在的视图如下所示:
也许有人需要 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>
现在,有了 AndroidX,您不需要自定义任何东西。
只需要添加 material 组件样式(在 1.1.0-alpha06
中添加,参见 release notes)。
<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>
Material Components library just use a TextInputLayout
Widget.MaterialComponents.TextInputLayout.*.ExposedDropdownMenu
风格。
类似于:
<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>
简单的解决方案是将 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();