NO IMAGE

AutoCompleteTextViewで文字入力しなくても候補を表示する方法

こんにちは。今回も前回に引き続き小ネタを紹介しようと思う(上手くいって嬉しかったので共有したい)。

AutoCompeleteTextView#setThreshold(int)とは

“AutoCompleteTextView”とは何ぞや,という話は,私がいつもお世話になっているTechBoosterさんの記事,「AutoCompleteを使う」を見ていただければ幸いである(投げた)。
さて,そのAutoCompleteTextView(EditText拡張のはずなのになんで”TextView”なんだ……)の入力補完を開始する文字数を規定するメソッド,

setThreshold(int)

について,ここに入れる値は「1以上」と決まっている(0をいれても挙動は1と同様になる)。つまり,最低でも1文字は入れないと補完がきかないのだ。

なんだそれは,ということで入力無しでも補完がされるように変更してみた。

自作クラス

まず,AutoCompleteTextViewを拡張した自作クラスを作る。

public class MyAutoCompleteTextView extends AutoCompleteTextView {
    public MyAutoCompleteTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        this.setThreshold(0);
    }
    public MyAutoCompleteTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.setThreshold(0);
    }
    public MyAutoCompleteTextView(Context context) {
        super(context);
        this.setThreshold(0);
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        showDropDown();
        return super.onTouchEvent(event);
    }
}

コンストラクタは引数の違う3種類を入れておかないとアプリが落ちる。その上で,

@Override
public boolean onTouchEvent(MotionEvent event) {
    showDropDown();
    return super.onTouchEvent(event);
}

とすることで,EditTextをタッチ(つまり入力が0の時でも)すればshowDropDown()(補完候補の表示)を実行するようになる。

他にも機能は足せるかもしれないが,とりあえずここで終わりにしよう。

layoutファイル

実際に使用するにはレイアウトをいじる必要がある。

<com.zienoc.autocomplete.MyAutoCompleteTextView
    android:id="@+id/complete_test"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:hint="名前を教えてください"
    android:inputType="text" >
</com.zienoc.autocomplete.MyAutoCompleteTextView>

のように,Viewタグをパッケージ名を含めた自作クラスのものにすげ替える。その他,Activity内での生成は,

MyAutoCompleteTextView test = (MyAutoCompleteTextView) findViewById(R.id.complete_test);

といつも通りキャストすればいい。

こんな細々としたことでも,自分で改造ができるようになってくるとアプリ開発してるなあって気がしてくるのです。