【AndroidのViewを制する】 ListPopupWindowの設定を変更する

このエントリーを Google ブックマーク に追加
Pocket
[`yahoo` not found]

今回、紹介するListPopupWindowは画面の任意の位置に好きなListViewをポップアップすることができます。
メソッドがたくさんあるため数回に分割して説明します。
今回はListPopupWindowの表示方法に関連するメソッドの説明します。

ListPopupWindowの設定

ListPopupWindowには表示方法や動作を変更するメソッドが多数定義されています。

使用メソッド

View.OnTouchListener createDragToOpenListener(View src) ViewをドラッグすることでListPopupWindowが開くようなタッチリスナーを生成します。
返却されたView.OnTouchListenerをViewに設定して使用します。
void setOnDismissListener(PopupWindow.OnDismissListener listener) ListPopupWindowが消えた時に呼ばれるコールバックインターフェースを設定します。
void setDropDownGravity(int gravity) ListPopupWindowの表示位置を設定します。 Gravity.START(アンカーViewとListPopupWindowの左側を揃える)とGravity.END(アンカーViewとListPopupWindowの右側を揃える)が使用できます。
void setContentWidth(int width) ListPopupWindowの幅を設定します。
void setAnimationStyle(int animationStyle) 表示時と非表示時のアニメーションを設定します。
int getAnimationStyle() 現在設定されているアニメーションを取得します。
void setModal(boolean modal) ListPopupWindowをモーダルにするかどうかを設定します。
trueを設定するとListPopupWindowが全てのタッチとキー入力を受け取るようになります。
boolean isModal() ListPopupWindowがモーダルかどうかを取得します。
void setInputMethodMode(int mode) ListPopupWindowのInputMethodModeを設定するメソッドです。
  • INPUT_METHOD_FROM_FOCUSABLE : ソフトウェアキーボードが表示された状態でPopupWindowを表示されるとPopupWindow内にフォーカスが移ります。
  • INPUT_METHOD_NEEDED : ソフトウェアキーボードが表示された状態でフォーカスを取得するViewが存在するPopupWindowが表示されるとPopupWindow内のViewにフォーカスが移ります。
  • INPUT_METHOD_NOT_NEEDED : ソフトウェアキーボードが表示された状態でPopupWindowを表示されてもPopupWindow内のViewにフォーカスは移りません。
int getInputMethodMode() ListPopupWindowのInputMethodModeを取得するメソッドです。
void setSoftInputMode(int mode) ListPopupWindowが表示された時のソフトウェアキーボードの挙動を設定します。
int getSoftInputMode() ListPopupWindowが表示された時のソフトウェアキーボードの挙動を取得します。
boolean isInputMethodNotNeeded() ListPopupWindowの内容がIMEとの連携が必要ない場合はtrueを返却し、IMEとの連携を必要とする場合はfalseを返却します。

使用サンプル

public class B4Activity extends Activity {
    private final static String TAG ="ListPopupWindow";
    final String[] strings = new String[] {
            "日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FrameLayout frameLayout = new FrameLayout(this);
        final ImageView imageView = new ImageView(this);
        imageView.setImageResource(R.mipmap.ic_launcher);
        FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ListPopupWindow.WRAP_CONTENT, ListPopupWindow.WRAP_CONTENT);
        layoutParams.gravity = Gravity.CENTER;
        frameLayout.addView(imageView , layoutParams);
        setContentView(frameLayout);

        final ListPopupWindow listPopupWindow = new ListPopupWindow(B4Activity.this);
        listPopupWindow.setAnchorView(imageView);
        // リスト用アダプターを用意します。
        final ListAdapter listAdapter = new ArrayAdapter<>(B4Activity.this, android.R.layout.simple_list_item_1, strings);
        listPopupWindow.setAdapter(listAdapter);
        listPopupWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Log.d(TAG, "onItemClick");
            }
        });
        imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // モーダルとして表示する。
                listPopupWindow.setModal(true);
                // ソフトウェアキーボードを常に表示します。
                listPopupWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
                Log.d(TAG, "onClick: " + listPopupWindow.isInputMethodNotNeeded());
                // ListPopupWindow内を移動させます。
                listPopupWindow.setInputMethodMode(ListPopupWindow.INPUT_METHOD_FROM_FOCUSABLE);
                // ポップアップ
                Log.d(TAG, "isInputMethodNotNeeded: " + listPopupWindow.isInputMethodNotNeeded());
                listPopupWindow.show();
            }
        });
        // 指定したViewをドラッグすることで開くタッチリスナーを生成します。
        View.OnTouchListener dragToOpenListener = listPopupWindow.createDragToOpenListener(imageView);
        imageView.setOnTouchListener(dragToOpenListener);
        // ListPopupWindowが消えた時に呼ばれるコールバックインターフェースを設定します。
        listPopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
            @Override
            public void onDismiss() {
                Log.d(TAG, "onDismiss");
            }
        });
        // ListPopupWindowの幅を設定します
        listPopupWindow.setContentWidth(900);
        // ListPopupWindowの表示位置を左側にずらします。
        listPopupWindow.setDropDownGravity(Gravity.END);
        // ListPopupWindowの表示時と非表示時のアニメーションを変更します。
        listPopupWindow.setAnimationStyle(R.style.PopupAnimation);
    }
}