AutoCompleteTextViewにフォーカスを当てたままキーボードを非表示にする

## AutoCompleteTextViewとは

キーボードによるインプットに対して、自動で文字を補完してくれる機能を備えもったEditTextのことです。

通常、Googleの[マテリアルデザインガイドライン](https://material.io/develop/android/components/menu)に則ったドロップダウンメニューを作成する場合は以下のような実装をします。

***res/layout/dropdown_menu.xml***

```xml
<com.google.android.material.textfield.TextInputLayout
    android:id="@+id/lyt_dropdown"
    style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox.ExposedDropdownMenu"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="項目名１">
    
    <androidx.appcompat.widget.AppCompatAutoCompleteTextView
    android:id="@+id/dropdown"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

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

***res/layout/item_dropdown_menu.xml***

```xml
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="16dp"
    android:ellipsize="end"
    android:maxLines="1"
    android:textAppearance="?attr/textAppearanceSubtitle1"/>

```

ちなみに`android:ellipsize="end"`を
`android:ellipsize="start"`にするとテキストを全文表示できます。

```java
final AutoCompleteTextView view = root.findViewById(R.id.dropdown);
ArrayAdapter<String> adapter = new ArrayAdapter<>(
    view.getContext(), 
    R.layout.item_dropdown_menu, 
    new String[]{
        "選択値１",
        "選択値２",
        "選択値３",
        "選択値４",
        "選択値５",
});
view.setAdapter(adapter);
```

しかし、このままではテキストボックスを選択した時にドロップダウンメニューが表示されているのにキーボードも表示されてしまいます。

`AutoCompleteTextView`は`EditText`でもあるのでカーソルも表示されてしまいます。

![AutoCompleteTextView1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584743/33e34c6f-3546-f5fe-0bec-afedb4cd0cb4.gif)

あくまで[material.io](https://material.io/)はデザインのガイドラインなので、デザインのことしか記載されていません。

[ドロップダウンーメニューのデザイン](https://material.io/develop/android/components/menu)

[テキストフィールドのデザイン](https://material.io/develop/android/components/text-fields)

ここからhintの色変更等のリッチな動きはキープしつつ、
カーソルやキーボードが表示されない以下のようなイメージにしたいですね。

![AutoCompleteTextView2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584743/469f848c-4a89-7d6c-6bc6-8b167ef33116.gif)

## カーソルの非表示

AutoCompleteTextViewのレイアウトファイルに`android:cursorVisible="false"`を追加してあげます。

## キーボードの非表示

フォーカスを当ててた際のリッチな動きはそのままに、
キーボードを非表示にする方法は以下のコードで実現できます。

`AutoCompleteTextView`の

`android:focusable="true"`
`android:focusableInTouchMode="true"`


- レイアウトファイル

```xml
<com.google.android.material.textfield.TextInputLayout
    android:id="@+id/lyt_dropdown"
    style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox.ExposedDropdownMenu"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="16dp"
    android:layout_marginRight="16dp"
    android:hint="項目名１">
    
    <androidx.appcompat.widget.AppCompatAutoCompleteTextView
    android:id="@+id/dropdown"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/white"
    android:cursorVisible="false"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:maxLines="1"
    android:text="選択肢１"
    android:textSize="18sp"
    tools:ignore="LabelFor" />

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

- javaの場合

```java
AutoCompleteTextView view = findViewById(R.id.dropdown);
view.setShowSoftInputOnFocus(false);
```

- kotlinの場合

```kotlin
dropdown.setShowSoftInputOnFocus = false
```

## 環境

Android Studio 4.1.1
Build #AI-201.8743.12.41.6953283, built on November 5, 2020
Runtime version: 1.8.0_242-release-1644-b01 amd64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Windows 10 10.0
GC: ParNew, ConcurrentMarkSweep
Memory: 4029M
Cores: 8
Registry: ide.new.welcome.screen.force=true, external.system.auto.import.disabled=true
Non-Bundled Plugins: org.jetbrains.kotlin, com.developerphil.adbidea