web-dev-qa-db-ja.com

フローティングビューをAndroidウィンドウマネージャーに追加し、システム/ハードウェアの戻るボタンイベントをリッスンする方法

ウィンドウマネージャーにフローティングビューを表示するサービスがあります(WINDOW_TYPE_ALERT権限を使用)。それを表示してアクションを実行することができます。しかし、私には2つの具体的な質問があります。

  1. フローティングビューの実装について
  2. ビューを閉じることができるようにシステムの戻るボタンイベントを聞く方法。

実装:

マニフェストで、次の権限を追加しました。

<uses-permission Android:name="Android.permission.SYSTEM_ALERT_WINDOW" />

アラームイベントをリッスンする放送受信機があります。イベントを受けて、フローティングビューを表示するサービスを開始しています。以下は、ビューの作成に使用しているコードです。

LayoutParams layOutParams = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
                WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
                PixelFormat.TRANSLUCENT);

ユーザーがビューに対して何らかのアクションを実行するたびに、ウィンドウマネージャーからビューを削除し、サービスを強制終了します。

私が知りたいのは、これが問題に取り組む正しい方法であるか、それともそれを行うためのより良い方法があるかどうかです。また、LayoutParamsに変更を加える必要がありますか、それともそのままにしておく必要がありますか?

次に、SYSTEM BACK/HARDWARE BACKボタンを押したときに、このフローティングビューを閉じたいと思います。これを行う方法についてのポインタは役に立ちます。

理解を深めるために、フローティングビューのスクリーンショットを添付します。

Floating View

12
Handroid

戻るボタンの検出に関して-私は次のように機能するようにしました(すべてがサービスonCreateコードで発生します):

  1. 目的のビューをViewGroup(LinearLayout、Relativeまたはその他)にラップします
  2. ラッパービューで次のようにdispatchKeyEventをオーバーライドします。
mView = new RelativeLayout(this) {
        @Override
        public boolean dispatchKeyEvent(KeyEvent event) {
            if (event.getKeyCode()==KeyEvent.KEYCODE_BACK) {
                // < your action >
                return true;
            }
            return super.dispatchKeyEvent(event);
        }
};
  1. ウィンドウマネージャーにラッパービューを追加し、WindowManager.LayoutParams.FLAG_NOT_FOCUSABLEがラッパーレイアウトパラメーターに設定されていないことを確認します。
11
qbasso

Standout Libraryを見てください。これはフローティングウィンドウの処理に適しています。バックプレスイベントも処理していないようです。開発者に連絡すると役立つ場合があります。

そしてもう1つの方法は、半透明の背景/テーマでアクティビティを開いて、Any.doのフローティングウィンドウで使用されるのと同様の効果を取得し、backpressイベントを処理できるようにすることです。

6
Balaji

[戻る]ボタンについて-ビュー内の「onBackPressed()」をオーバーライドして、必要な操作を行う必要があります

@Override
public boolean onBackPressed() {
    // Remove your view from the window...
}

とにかく、私は Tooleapと呼ばれるSDK を使用して、フローティングウィンドウを簡単な方法で表示しています。

2
devdev

HOMEボタンでUIも閉じますか?そうした場合、アラートウィンドウではなく、透明な背景で開くアクティビティを使用する方がよいように思われます。これを行うには、アクティビティのテーマとして次のスタイルを使用します

<style name="Transparent">
    <item name="Android:windowFrame">@null</item>
    <item name="Android:windowBackground">@color/transparent</item>
    <item name="Android:windowIsFloating">true</item>
    <item name="Android:windowContentOverlay">@null</item>
    <item name="Android:windowAnimationStyle">@Android:style/Animation.Dialog</item>
    <item name="Android:windowSoftInputMode">stateUnspecified|adjustPan</item>
    <item name="Android:windowFullscreen">true</item>
</style>
1
yoah