【AndroidのViewを制する】 ListPopupWindowの設定を変更する
今回、紹介する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を設定するメソッドです。
|
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); } }