Создайте прозрачный диалог поверх активности

Задний план

Я пытаюсь поместить слой поверх текущей активности, который будет иметь объяснение того, что происходит на текущем экране, аналогично тому, что происходит на приложение contact+ .

Я знаю, что для этого есть несколько решений (например, библиотека showCase и библиотеку superToolTips), и я также знаю, что я могу создать представление и установить его поверх, добавив его в окно действия, но мне нужно поместить весь слой диалога сверху.

Проблема

Что бы я ни пробовал, каждое решение не работает так, как мне нужно.

короче, что мне нужно:

  • полноэкранный диалог.

  • никаких изменений (не визуальных и не логических) в панели действий, панели уведомлений и содержимом действия позади, что означает, что все, что находится за диалоговым окном, остается прежним, оно было показано за мгновение до отображения диалогового окна.

  • быть прозрачным, за исключением видов, которые я использую для диалога, который должен отображаться нормально.

что я пробовал

К сожалению, у меня всегда есть только часть того, что мне нужно.

вот мой код:

стили.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>

Основная активность.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();
}

person android developer    schedule 20.08.2013    source источник
comment
Блестяще хорошо написано, ничего читать не пришлось, просто дойти до конца вопроса и там ответ .. спасибо   -  person Siddharth    schedule 27.06.2014
comment
Этот диалог я хочу отобразить в центре экрана.... как я могу это сделать?   -  person Ravi Yadav    schedule 23.09.2015
comment
Понятно.... window.setLayout(WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT);   -  person Ravi Yadav    schedule 23.09.2015
comment
@ user3138859 Я не понимаю. Прости   -  person android developer    schedule 23.09.2015
comment
@androiddeveloper WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT); с этим диалоговым окном, появляющимся вверху. Но с обертыванием содержимого оно появляется в центре   -  person Ravi Yadav    schedule 24.09.2015
comment
@user3138859 user3138859 хорошо, я думаю, вы нашли, как с этим справиться. :)   -  person android developer    schedule 24.09.2015
comment
Было бы полезно, если бы вы добавили код R.layout.floating_tutorial в этот пост.   -  person Mike76    schedule 19.08.2016
comment
@ Mike76 Нет, потому что вы можете делать в макете все, что хотите. Это неважно. Вы выбираете, что туда положить.   -  person android developer    schedule 19.08.2016
comment
Дано отличное решение   -  person Parth Anjaria    schedule 15.02.2018


Ответы (2)


Просто измените цвет фона вашего диалога:

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

Редактировать:

Это предотвращает эффект затемнения:

dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
person Steve Benett    schedule 20.08.2013
comment
простое и короткое решение. это сработало. однако по какой-то причине экран затемняется, когда отображается диалоговое окно. подскажите, пожалуйста, как его изменить (настроить и/или отключить). - person android developer; 20.08.2013
comment
ой удалили мой комментарий. если вы удалите свое, я удалю свое... :) в любом случае, спасибо. это сработало отлично. - person android developer; 20.08.2013
comment
@androiddeveloper np :) это действительно раздражает настройка, потому что она хорошо скрыта во фреймворке - person Steve Benett; 20.08.2013
comment
Что из того, что я написал, мне больше не нужно? я думаю, что full_screen_dialog не нужен. есть еще? - person android developer; 20.08.2013
comment
Единственный код, который кажется мне подозрительным, это dialog.getWindow().setFormat(PixelFormat.TRANSLUCENT); - person Steve Benett; 20.08.2013
comment
Спасибо. это работает хорошо. теперь я обновлю свой вопрос, чтобы получить рабочее решение. - person android developer; 21.08.2013
comment
Этот подход помог мне исправить прозрачность презентации для вторичного дисплея. Но по какой-то причине у меня это работало только с использованием null вместо ColorDrawable... - person dragi; 28.04.2014

Просто добавьте это, это действительно работает!

<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>
person Javier Rodriguez    schedule 30.06.2015
comment
Это было давно. Я даже не помню этот вопрос. - person android developer; 30.06.2015
comment
это может быть полезно для других людей, вы не единственный человек, который может захотеть реализовать такое окно - person Mike76; 19.08.2016