Діяльність Android як діалог


257

У мене є діяльність на ім'я whereActity яке також має діалогові діалоги. Тепер я хочу відобразити цю діяльність як діалог для іншої діяльності.

Як я можу це зробити?

введіть тут опис зображення


Якщо ви просто хочете діалогове вікно завантаження, ви можете використовувати ProgressDialog
Daksh Agrawal

Відповіді:


546

Щоб розпочати діяльність як діалог, я визначив її так AndroidManifest.xml:

<activity android:theme="@android:style/Theme.Dialog" />

Використовуйте це властивість всередині activityтегу, щоб уникнути появи діалогового вікна у списку нещодавно використаних програм

android:excludeFromRecents="true"

Якщо ви хочете не допустити руйнування діалогу / активності, коли користувач натискає його поза діалоговим вікном:

Після setContentView()в Activityкористуванні:

this.setFinishOnTouchOutside(false);

Тепер, коли я закликаю, startActivity()це відображається як діалогове вікно, при цьому попередня активність відображається, коли користувач натискає кнопку назад.

Зауважте, що якщо ви використовуєте ActionBarActivity(або тему AppCompat), вам потрібно буде скористатися @style/Theme.AppCompat.Dialogнатомість.


186
Використання андроїда: theme = "@ android: style / Theme.Dialog" - це шлях, але не забудьте використовуватиludeFromRecents = true, інакше діалогове вікно з’явиться в програмах, які нещодавно використовували (утримуйте клавішу Home).
Еммануїл

7
У мене виникають труднощі, пов'язані з діяльністю як діалоговим вікном .. Я зробив діяльність як діалог, але проблема полягає в тому, що коли я натискаю за межами діяльності, вона автоматично закривається .. ??? чи є якесь рішення, пов’язане з цим .. ??????
Росомаха

7
@Emmanuel, він повинен бути андроїд: excludeFromRecents = «істина» , зверніть увагу на подвійні лапки
SANDEEP

43
Зауважте, що якщо ви використовуєте ActionBarActivity (або тему AppCompat), вам потрібно буде використовувати@style/Theme.AppCompat.Dialog
Quentin Klein

8
@Wolverine, Додати метод this.setFinishOnTouchOutside(false);після, setContentView()щоб запобігти знищенню активності при натисканні кнопки за межами створеного діалогу.
Anggrayudi H

43

Використовуйте цей код, щоб діалогова активність не була закрита, коли користувач торкнеться поза діалогового вікна:

this.setFinishOnTouchOutside(false);

вимагає рівня 11


1
Чи є рішення для API <11?
ПК Гупта

@pkgupta, якщо це прийнятно для вас, ви не повинні турбуватися принаймні API <15 для мене, оскільки в будь-якому разі не так багато людей, які використовують ті попередні версії. Насправді, станом на 2017 рік, я думаю, що 19 чи 20 - це новий minSDK.
Неонова Варга

28

Ви можете визначити цей стиль у значеннях / styles.xml, щоб виконати більш колишній Splash:

   <style name="Theme.UserDialog" parent="android:style/Theme.Dialog">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:background">@android:color/transparent</item>
        <item name="android:windowBackground">@drawable/trans</item>
    </style>

І використовуйте його AndroidManifest.xml:

   <activity android:name=".SplashActivity"
          android:configChanges="orientation"
          android:screenOrientation="sensor"
          android:theme="@style/Theme.UserDialog">

2
re @drawable/trans: ви повинні мати можливість використовувати те, @android:color/transparentщо створило б ColorDrawableдля використання як фони.
TWiStErRob

1
<item name = "android: windowBackground"> ​​@ null </item> - ще одна альтернатива
TouchBoarder

Проблема полягає в тому, що діяльність заповнює весь екран, але не відображається як діалогове накладення.
Shajeel Afzal

Це <item name="windowNoTitle">true</item> (немає "андроїд"). Дивіться тут . Не впевнений у інших пунктах.
Gary99

23

1 - Ви можете динамічно використовувати ту саму діяльність, що й діалогове та повний екран:

Телефонуйте setTheme(android.R.style.Theme_Dialog)перед дзвінками setContentView(...)та super.oncreate()у своїй діяльності.

2 - Якщо ви не плануєте змінювати стиль теми діяльності, який ви можете використовувати

<activity android:theme="@android:style/Theme.Dialog" />

(як згадував @faisal khan)


Лише зауваження: коли я використовую програмний метод (перший метод), все, що знаходиться за діалоговим вікном, вичерпується повністю; це не було проблемою в іншому методі. Шкода ... Мені дуже хотілося це робити програмно .... Nexus 5, Android 6.0.1
Ерік

@Eric Ви знайшли рішення для темношкірих ??
ананд

1
@anand так, поєднання обох рішень разом виправляє проблему затемнення: встановіть тему активності на тему діалогу в android manifest ( <activity android:theme="@android:style/Theme.Dialog" />) і програмуйте тему активності на діалог чи активність у onCreate stackoverflow.com/a/35915764/2898715
Ерік

21

Якщо вам потрібна версія Appcompat

style.xml

    <!-- Base application theme. -->
    <style name="AppDialogTheme" parent="Theme.AppCompat.Light.Dialog">
        <!-- Customize your theme here. -->
        <item name="windowActionBar">false</item>
        <item name="android:windowNoTitle">true</item>
    </style>

yourmanifest.xml

    <activity
          android:name=".MyActivity"
          android:label="@string/title"
          android:theme="@style/AppDialogTheme">
    </activity>

Це чудово. Мені потрібно було зняти панель дій. Мені довелося трохи змінити XML. Мені довелося додати, <item name="windowNoTitle">true</item>щоб він працював на мене. Я також додав <item name="android:windowActionBar">false</item>для гарної міри.
Ерік

5
Також для мене <item name="android:windowNoTitle">true</item>не працювало (Android 5.0.1), і мені довелося змінити<item name="windowNoTitle">true</item>
повідомити

17

Якщо ваша діяльність відображається як діалогове вікно, просто додайте кнопку до xml вашої діяльності,

<Button
    android:id="@+id/close_button"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Dismiss" />

Потім приєднайте слухач кліків до Java-коду вашої діяльності. У слухача просто дзвонітьfinish()

Button close_button = (Button) findViewById(R.id.close_button);
close_button.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        finish();
    }
});

Це має закрити діалог, повертаючи вас до виклику.


8

Якщо ви хочете видалити заголовок активності та надати спеціальний вигляд діалогового вікна, додайте наступне до маніфесту активності у вашому маніфесті

android:theme="@style/Base.Theme.AppCompat.Dialog"

і спроектуйте свою діяльність_лаута з потрібним поданням


2

Встановіть тему у файлі маніфесту Android.

<activity android:name=".LoginActivity"
            android:theme="@android:style/Theme.Dialog"/>

І встановіть діалоговий стан на дотик, щоб закінчити.

this.setFinishOnTouchOutside(false);

1

Створіть активність як діалог, ось повний приклад

введіть тут опис зображення

  1. AndroidManife.xml

    <activity android:name=".appview.settings.view.DialogActivity" android:excludeFromRecents="true" android:theme="@style/Theme.AppCompat.Dialog"/>

  2. DialogActivity.kt

    class DialogActivity : AppCompatActivity() {
      override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_dialog)
        this.setFinishOnTouchOutside(true)
    
        btnOk.setOnClickListener {
          finish()
        }
      }
    }
  3. activity_dialog.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#0072ff"
    android:gravity="center"
    android:orientation="vertical">
    
    <LinearLayout
        android:layout_width="@dimen/_300sdp"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:orientation="vertical">
    
        <TextView
            android:id="@+id/txtTitle"
            style="@style/normal16Style"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:paddingTop="20dp"
            android:paddingBottom="20dp"
            android:text="Download"
            android:textColorHint="#FFF" />
    
        <View
            android:id="@+id/viewDivider"
            android:layout_width="match_parent"
            android:layout_height="2dp"
            android:background="#fff"
            android:backgroundTint="@color/white_90"
            app:layout_constraintBottom_toBottomOf="@id/txtTitle" />
    
        <TextView
            style="@style/normal14Style"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:paddingTop="20dp"
            android:paddingBottom="20dp"
            android:text="Your file is download"
            android:textColorHint="#FFF" />
    
    
        <Button
            android:id="@+id/btnOk"
            style="@style/normal12Style"
            android:layout_width="100dp"
            android:layout_height="40dp"
            android:layout_marginBottom="20dp"
            android:background="@drawable/circle_corner_layout"
            android:text="Ok"
            android:textAllCaps="false" />
        </LinearLayout>
    
      </LinearLayout>

Будь ласка, не використовуйте великі шрифти, щоб ваша відповідь виглядала дивно.
CopsOnRoad

0

Деколи ви можете отримати Виняток, який наведено нижче

Викликано: java.lang.IllegalStateException: Вам потрібно використовувати тему Theme.AppCompat (або нащадка) з цією діяльністю.

Тож для вирішення можна використовувати просте рішення

додайте тему вашої діяльності в маніфест як діалог для appCompact.

android:theme="@style/Theme.AppCompat.Dialog"

Це може бути корисно для когось.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.