Aktywność Androida jako okno dialogowe

257

Mam nazwane działanie, whereActityktóre ma również okna dialogowe potomne. Teraz chcę wyświetlić tę aktywność jako okno dialogowe dla innej aktywności.

Jak mogę to zrobić?

wprowadź opis zdjęcia tutaj

d-man
źródło
Jeśli chcesz tylko załadować okno dialogowe, możesz użyć ProgressDialog
Daksh Agrawal

Odpowiedzi:

546

Aby rozpocząć działanie jako okno dialogowe, zdefiniowałem to w następujący sposób AndroidManifest.xml:

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

Użyj tej właściwości w activitytagu, aby uniknąć wyświetlania okna dialogowego na liście ostatnio używanych aplikacji

android:excludeFromRecents="true"

Jeśli chcesz zatrzymać niszczenie okna dialogowego / aktywności, gdy użytkownik kliknie poza oknem dialogowym:

Po setContentView()w Activityużyciu:

this.setFinishOnTouchOutside(false);

Teraz, kiedy dzwonię startActivity(), wyświetla się jako okno dialogowe z poprzednią aktywnością pokazaną, gdy użytkownik naciśnie przycisk Wstecz.

Pamiętaj, że jeśli używasz ActionBarActivity(lub motywu AppCompat), musisz użyć @style/Theme.AppCompat.Dialogzamiast tego.

d-man
źródło
186
Korzystanie z androida: theme = "@ android: style / Theme.Dialog" to droga, ale nie zapomnij użyć excludeFromRecents = true, w przeciwnym razie okno dialogowe pojawi się w ostatnio używanych aplikacjach (przytrzymaj klawisz Home).
Emmanuel,
7
mam trudności związane z aktywnością jako okno dialogowe. Zrobiłem aktywność jako okno dialogowe, ale problem polega na tym, że kliknięcie poza aktywnością powoduje automatyczne zamknięcie. ??? czy jest jakieś rozwiązanie związane z tym ... ??????
Wolverine,
7
@Emmanuel, to musi być android: excludeFromRecents = "true" zwróć uwagę na podwójne cytaty
Sandeep
43
Pamiętaj, że jeśli używasz ActionBarActivity (lub motyw AppCompat), musisz użyć@style/Theme.AppCompat.Dialog
Quentin Klein
8
@Wolverine, Dodaj metodę this.setFinishOnTouchOutside(false);po setContentView(), aby zapobiec zniszczeniu aktywności po kliknięciu poza utworzonym oknem dialogowym.
Anggrayudi H
43

Użyj tego kodu, aby działanie okna dialogowego nie zostało zamknięte, gdy użytkownik dotknie poza oknem dialogowym:

this.setFinishOnTouchOutside(false);

wymaga poziomu interfejsu API 11

Politycznie niezależny
źródło
1
Czy jest jakieś rozwiązanie dla API <11?
PK Gupta
@pkgupta, jeśli jest to dla ciebie do przyjęcia, nie powinieneś martwić się przynajmniej API <15, ponieważ i tak niewiele osób korzysta z tych wcześniejszych wersji. W rzeczywistości od 2017 roku uważam, że 19 lub 20 to nowy minSDK.
Neon Warge
28

Możesz zdefiniować ten styl w wartości / styles.xml, aby wykonać wcześniejszy 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>

I użyj go AndroidManifest.xml:

   <activity android:name=".SplashActivity"
          android:configChanges="orientation"
          android:screenOrientation="sensor"
          android:theme="@style/Theme.UserDialog">
herbertD
źródło
2
re @drawable/trans: powinieneś być w stanie używać, @android:color/transparentktóre tworzyłoby ColorDrawablejako tło.
TWiStErRob
1
<item name = "android: windowBackground"> ​​@ null </item> to kolejna alternatywa
TouchBoarder
Problem polega na tym, że działanie wypełnia cały ekran, ale nie wyświetla się jako nakładka okna dialogowego.
Shajeel Afzal
To jest <item name="windowNoTitle">true</item> (bez „Androida”). Zobacz tutaj . Nie jestem pewien co do innych pozycji.
Gary99
23

1 - Możesz użyć tej samej aktywności, co w oknie dialogowym i na pełnym ekranie, dynamicznie:

Zadzwoń setTheme(android.R.style.Theme_Dialog)przed połączeniem setContentView(...)i super.oncreate()podczas swojej aktywności.

2 - Jeśli nie planujesz zmienić stylu motywu aktywności, którego możesz użyć

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

(jak wspomniał @faisal khan)

M. Usman Khan
źródło
Tylko uwaga: kiedy używam metody programistycznej (pierwsza metoda), wszystko za oknem dialogowym jest całkowicie zaciemnione; nie było to jednak problemem w innej metodzie. Szkoda ... Naprawdę chciałem to zrobić programowo .... Nexus 5, Android 6.0.1
Eric
@Eric, czy znalazłeś rozwiązanie na zaciemnienie?
anand
1
@ i tak, połączenie obu rozwiązań razem rozwiązuje problem zaciemnienia: ustaw temat aktywności na motyw okna dialogowego w manifeście Androida ( <activity android:theme="@android:style/Theme.Dialog" />) i programowo ustaw temat motywu na okno dialogowe lub aktywność w programie onCreate stackoverflow.com/a/35915764/2898715
Eric
21

Jeśli potrzebujesz wersji 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>
neferpitou
źródło
To jest świetne. Musiałem usunąć pasek akcji. Musiałem jednak nieco zmodyfikować XML. Musiałem dodać, <item name="windowNoTitle">true</item>żeby to działało dla mnie. Dodałem również <item name="android:windowActionBar">false</item>dla dobrego pomiaru.
Eric
5
Również dla mnie <item name="android:windowNoTitle">true</item>nie działał (Android 5.0.1) i musiałem zmienić na<item name="windowNoTitle">true</item>
noti
17

Jeśli twoja aktywność jest renderowana jako okno dialogowe, po prostu dodaj przycisk do pliku xml swojej aktywności,

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

Następnie dołącz odbiornik kliknięć do kodu Java działania. W słuchaczu po prostu zadzwońfinish()

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

To powinno zamknąć twoje okno dialogowe i powrócić do aktywności wywoływania.

aaronsnoswell
źródło
8

Jeśli chcesz usunąć nagłówek aktywności i zapewnić niestandardowy widok okna dialogowego, dodaj następujące elementy do bloku aktywności manifestu

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

i zaprojektuj swój plan aktywności z pożądanym widokiem

Ismail Iqbal
źródło
2

Ustaw motyw w pliku manifestu Androida.

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

I ustaw stan okna dotykowego, aby zakończyć.

this.setFinishOnTouchOutside(false);
Gyan Swaroop Awasthi
źródło
1

Utwórz aktywność jako okno dialogowe, oto pełny przykład

wprowadź opis zdjęcia tutaj

  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>
    
Sanjayrajsinh
źródło
Nie używaj dużych czcionek x, aby Twoja odpowiedź wyglądała dziwnie.
CopsOnRoad
0

Czasami możesz uzyskać wyjątek podany poniżej

Przyczyna: java.lang.IllegalStateException: Musisz użyć motywu Theme.AppCompat (lub potomka) z tą aktywnością.

Aby rozwiązać, możesz użyć prostego rozwiązania

dodaj motyw swojej aktywności jako manifest dla appCompact.

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

Może być komuś pomocny.

Gyan Swaroop Awasthi
źródło