web-dev-qa-db-ja.com

アクティビティの上に透明なダイアログを作成する

バックグラウンド

contact + app で発生することと同様に、現在の画面で何が起こっているかを説明する現在のアクティビティの上にレイヤーを配置しようとしています。

これにはいくつかの解決策があることを知っています( showCase library やsuperToolTipsライブラリ)、また、アクティビティのウィンドウに追加することでビューを作成して上に設定できることも知っています、ただし、ダイアログレイヤー全体を最上部に配置する必要があります。

問題

私が何を試みても、各ソリューションは私が必要とする方法で機能しません。

要するに、私が必要なのは:

  • 全画面ダイアログ。

  • アクションバー、通知バー、および背後のアクティビティのコンテンツに変化はありません(視覚的でも論理的でもありません)。

  • 私がダイアログに使用するビューを除き、透明にする必要があります。これは通常表示されるはずです。

私が試したこと

悲しいことに、私は常に必要なものの一部しか持っていません。

ここに私のコードがあります:

styles.xml:

<style name="full_screen_dialog">
        <item name="Android:windowFrame">@null</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>
    </style>

MainActivity.Java:

...
final Dialog dialog = new Dialog(this, R.style.full_screen_dialog);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.floating_tutorial);
dialog.getWindow().setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
dialog.getWindow().setFormat(PixelFormat.TRANSLUCENT);
dialog.show();

このコードはアクティビティの上にレイアウトを配置しますが、悲しいことに、設定したにもかかわらず透明度がありません。私が使用したレイアウトは非常にシンプルであるため、投稿しません。

質問

私は何が欠けていますか?コードを修正するにはどうすればよいですか?

どうすればダイアログを透明で全画面表示にでき、アクションバーと通知バーを変更しないようにできますか。


実用的なソリューション

編集:良い解決策を見つけた後、ここに作業コードがあります:

@Override
protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final Dialog dialog = new Dialog(this);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.setContentView(R.layout.floating_tutorial);
    final Window window = dialog.getWindow();
    window.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);
    window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
    window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    dialog.show();
}
42

ダイアログの背景色を変更するだけです:

dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

編集:

これは薄暗い効果を防ぎます:

dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
54
Steve Benett

これを追加するだけで、本当に機能します!

<item name="Android:windowIsTranslucent">true</item>
        <item name="Android:windowCloseOnTouchOutside">true</item>
        <item name="Android:windowBackground">@Android:drawable/alert_dark_frame</item>
        <item name="Android:windowContentOverlay">@null</item>
        <item name="Android:windowNoTitle">true</item>
        <item name="Android:windowIsFloating">true</item>
        <item name="Android:backgroundDimEnabled">false</item>
3