web-dev-qa-db-ja.com

TextInputLayoutおよびAutoCompleteTextView

私は TextInputLayout を私のAndroidアプリで使用して、入力フィールドにそのきちんとしたフローティングラベル効果を達成します。 TextInputEditText また、横長モードで入力が画面全体に表示されているときにヒントを表示できるようにします。

ただし、一部の入力フィールドでは AutoCompleteTextView を使用してオートコンプリートを実行しています(IMOの名前は「EditText」ではなく「TextView」ですが、これには一貫性がありません)。別の話)そしてそれは明らかにEditTextから直接継承します。したがって、TextInputEditTextがもたらすのと同じ機能はありません。

そのため、同じ独自のヒント機能(つまり、独自のTextInputAutoCompleteTextView実装を作成せずに)を実現し、生成されるlint警告を回避する方法があるかどうか疑問に思っています。ここで何か不足していますか?私は彼らがこの特定のもののためにEditTextのすべての直接および間接サブクラスのカスタムバージョンを作成しなかったと思うので、私は自分で作成することを期待されていますか?

33
sindrenm

少し遅れますが、はい、独自の実装をロールバックする必要があります。良いニュースは、これはかなり簡単なことです。 TextInputEditTextの実装方法は次のとおりです。

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

したがって、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;
    }
}
29
chessdork

チェスドルクの答えをもとに、オートフィルをヒントと一緒にプロジェクトに組み込む方法について詳しく説明します。これが私がそれを機能させるために使用した正確なステップです:

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>
6
Shn_Android_Dev

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> 
3
R00We

両方の回答(@chessdorkと@Shn_Android_Dev)は、TextInputLayout(TIL)内のAutoCompleteTextView(ACTV)の正しい動作を実現するのに役立ちますが、TILの開始/終了と内部のACTVの間にスペースがないことがわかりました次の画像でわかるように:

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

問題を解決するために私がやったことは、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"/>

そして、ビューは次のようになります。

Example with the correct spacing

1
Seven

簡単な解決策は、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();
0
Noman Nazir

たぶん誰かが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>
0
Erick Velasco

Material Components libraryTextInputLayoutWidget.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>

enter image description here

0