ディスプレイの中央に配置され、ロードされたビューのコンテンツに合わせて動的にサイズ変更される Android で PopupWindow を作成しようとしています。さらに、ポップアップの外側をタップすると、ポップアップが消えるはずです。SDK バージョン 11 以降では、このコードは正常に機能しますが、SDK 10 (アプリがサポートする必要がある最小値) では、setWindowLayoutMode は一見何もしません。
これまでのところ、SDK 10 の問題 (バグ?) を除いて、クリーンで効率的なこのロジックをサブクラス化しました。私が間違っていることについて何か考えはありますか? setWindowLayoutMode はバージョン 3 から存在しているため、ドキュメントに記載されているように機能していないとは思えません。SDK のバグの場合、問題を回避するにはどうすればよいですか? ウィンドウサイズを手動で設定するつもりで、画面のサイズを制限として contentView で .measure() を試しましたが、返される値は予想される結果とは大きく異なりました。
画面のサイズに合わせて設定できるレイアウトで TextView をラップすることで、ウィンドウを簡単に中央に配置できますが、その後、素敵な ACTION_OUTSIDE タップ イベントが失われるため、回避できる場合はそのパスにつまずいたくありません。
SDK 10 で発生している問題は、単にウィンドウが表示されないということです... 技術的には、寸法が 0,0 またはオフスクリーンのいずれかで「表示」されます。後続のタップで OnTouchListener がトリガーされますが、確かにその内容が正しく表示されていません。
public class InfoPopupWindow extends PopupWindow {
private View _parentView;
public InfoPopupWindow(Context context, View parentView) {
super(context);
LayoutInflater inflater = LayoutInflater.from(context);
View contentView = inflater.inflate(R.layout.window_info, null, false);
this.setContentView(contentView);
this.setWindowLayoutMode(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
// This combo of parameters sends outside events properly, and inside events as well.
this.setOutsideTouchable(true);
this.setBackgroundDrawable(new BitmapDrawable());
this.setTouchInterceptor(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
Log.d("InfoPopupWindow", "Outside Window Touch Event");
dismiss();
}
return true;
}
});
this.setAnimationStyle(R.style.PopupAnimation);
_parentView = parentView;
}
public void show() {
this.showAtLocation(_parentView, Gravity.CENTER, 0, 0);
}
}
R.layout.window_info
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/info_text"
android:id="@+id/textView"
android:background="#000000"
android:padding="15dp" />