Aktywność Androida jako okno dialogowe


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.


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


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">

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)


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>

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.


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


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);

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>
    

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.