私は TextInputLayout
を私のAndroidアプリで使用して、入力フィールドにそのきちんとしたフローティングラベル効果を達成します。 TextInputEditText
また、横長モードで入力が画面全体に表示されているときにヒントを表示できるようにします。
ただし、一部の入力フィールドでは AutoCompleteTextView
を使用してオートコンプリートを実行しています(IMOの名前は「EditText」ではなく「TextView」ですが、これには一貫性がありません)。別の話)そしてそれは明らかに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;
}
}
チェスドルクの答えをもとに、オートフィルをヒントと一緒にプロジェクトに組み込む方法について詳しく説明します。これが私がそれを機能させるために使用した正確なステップです:
1)implementation 'com.Android.support:design:26.1.0'
あなたのgradle依存関係に。正確なパッケージ名は、SDKバージョンによって多少異なります。
2)@chessdorkの回答からTextInputAutoCompleteTextView
クラスをコピーし、プロジェクト内のパブリッククラスに配置します。
3)XMLレイアウトで自動入力edittextを配置する場所に配置します。次のように構成する必要があります。
<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>
AndroidXでは、何かをカスタマイズする必要はありません。
マテリアルコンポーネントスタイルを追加するだけです(1.1.0-alpha06
で追加されました。 リリースノート を参照してください)。
<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>
両方の回答(@chessdorkと@Shn_Android_Dev)は、TextInputLayout(TIL)内のAutoCompleteTextView(ACTV)の正しい動作を実現するのに役立ちますが、TILの開始/終了と内部のACTVの間にスペースがないことがわかりました次の画像でわかるように:
問題を解決するために私がやったことは、TextInputAutoCompleteTextView
の最初と最後にいくつかのパディング値を追加することでした。それで遊んで、あなたの望む効果を得ることができます。 @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"/>
そして、ビューは次のようになります。
簡単な解決策は、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();
たぶん誰かが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>
Material Components library で 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>