【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);
}
}