Android-Aktivität als Dialog


257

Ich habe eine Aktivität mit dem Namen, whereActitydie auch untergeordnete Dialoge enthält. Jetzt möchte ich diese Aktivität als Dialogfeld für eine andere Aktivität anzeigen.

Wie kann ich das machen?

Geben Sie hier die Bildbeschreibung ein


Wenn Sie nur den Dialog laden möchten, können Sie ProgressDialog
Daksh Agrawal

Antworten:


546

Um die Aktivität als Dialog zu starten, habe ich sie folgendermaßen definiert AndroidManifest.xml:

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

Verwenden Sie diese Eigenschaft in Ihrem activityTag, um zu vermeiden, dass Ihr Dialogfeld in der Liste der zuletzt verwendeten Apps angezeigt wird

android:excludeFromRecents="true"

Wenn Sie verhindern möchten, dass Ihr Dialog / Ihre Aktivität zerstört wird, wenn der Benutzer außerhalb des Dialogfelds klickt:

Nach setContentView()Ihrer ActivityVerwendung:

this.setFinishOnTouchOutside(false);

Wenn ich startActivity()es jetzt aufrufe, wird es als Dialog angezeigt. Die vorherige Aktivität wird angezeigt, wenn der Benutzer die Zurück-Taste drückt.

Beachten Sie, dass Sie stattdessen ActionBarActivity(oder das AppCompat-Design) verwenden müssen @style/Theme.AppCompat.Dialog.


186
Die Verwendung von android: theme = "@ android: style / Theme.Dialog" ist der richtige Weg, aber vergessen Sie nicht, excludeFromRecents = true zu verwenden. Andernfalls wird Ihr Dialogfeld in den zuletzt verwendeten Apps angezeigt (halten Sie die Home-Taste gedrückt).
Emmanuel

7
Ich habe Schwierigkeiten mit der Aktivität als Dialog. Ich habe die Aktivität als Dialog gemacht, aber das Problem ist, wenn ich außerhalb der Aktivität klicke, wird sie automatisch geschlossen. Gibt es eine Lösung im Zusammenhang damit .. ??????
Wolverine

7
@ Emmanuel, es muss Android sein: excludeFromRecents = "true" Beachten Sie die doppelten Anführungszeichen
Sandeep

43
Beachten Sie, dass Sie, wenn Sie ActionBarActivity (oder AppCompat-Design) verwenden, verwenden müssen@style/Theme.AppCompat.Dialog
Quentin Klein

8
@Wolverine, Methode After hinzufügen, this.setFinishOnTouchOutside(false);um setContentView()zu verhindern, dass die Aktivität zerstört wird, wenn Sie außerhalb des von Ihnen erstellten Dialogfelds klicken.
Anggrayudi H

43

Verwenden Sie diesen Code, damit die Dialogaktivität nicht geschlossen wird, wenn der Benutzer außerhalb des Dialogfelds berührt:

this.setFinishOnTouchOutside(false);

erfordert API Level 11


1
Gibt es eine Lösung für API <11?
PK Gupta

@pkgupta, wenn es für Sie akzeptabel ist, sollten Sie sich zumindest keine Sorgen um API <15 machen, da es sowieso nicht viele Leute gibt, die diese früheren Versionen verwenden. Tatsächlich denke ich, dass ab 2017 19 oder 20 das neue minSDK ist.
Neon Warge

28

Sie können diesen Stil in values ​​/ styles.xml definieren, um einen früheren Splash auszuführen:

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

Und benutze es AndroidManifest.xml:

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

2
Betreff @drawable/trans: Sie sollten in der Lage sein @android:color/transparent, einen ColorDrawableHintergrund zu verwenden.
TWiStErRob

1
<item name = "android: windowBackground"> ​​@ null </ item> ist eine weitere Alternative
TouchBoarder

Das Problem ist, dass die Aktivität den gesamten Bildschirm ausfüllt, aber nicht als Dialogüberlagerung angezeigt wird.
Shajeel Afzal

Es ist <item name="windowNoTitle">true</item> (kein "Android"). Siehe hier . Ich bin mir bei den anderen Artikeln nicht sicher.
Gary99

23

1 - Sie können dieselbe Aktivität wie Dialog und Vollbild dynamisch verwenden:

Rufen Sie setTheme(android.R.style.Theme_Dialog)vor dem Anruf setContentView(...)und super.oncreate()in Ihrer Aktivität an.

2 - Wenn Sie nicht vorhaben, den Stil des Aktivitätsthemas zu ändern, können Sie ihn verwenden

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

(wie von @faisal khan erwähnt)


Nur eine Anmerkung: Wenn ich die programmatische Methode (die erste Methode) verwende, ist alles hinter dem Dialogfeld vollständig verdunkelt. Dies war jedoch bei der anderen Methode kein Problem. Schade ... ich wollte es wirklich programmatisch machen ... Nexus 5, Android 6.0.1
Eric

@ Eric hast du eine Lösung für Blackout gefunden?
13.

1
@anand yes, das Kombinieren beider Lösungen behebt das Blackout-Problem: Setzen Sie das Aktivitätsthema in Android Manifest ( <activity android:theme="@android:style/Theme.Dialog" />) auf ein Dialogthema und setzen Sie das Aktivitätsthema programmgesteuert auf einen Dialog oder eine Aktivität in onCreate stackoverflow.com/a/35915764/2898715
Eric

21

Wenn Sie eine Appcompat-Version benötigen

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>

Das ist toll. Ich musste die Aktionsleiste entfernen. Ich musste das XML allerdings leicht modifizieren. Ich musste hinzufügen <item name="windowNoTitle">true</item>, damit es für mich funktioniert. Ich habe auch <item name="android:windowActionBar">false</item>für ein gutes Maß hinzugefügt .
Eric

5
Auch für mich <item name="android:windowNoTitle">true</item>hat es nicht funktioniert (Android 5.0.1), und ich musste zu<item name="windowNoTitle">true</item>
noti

17

Wenn Ihre Aktivität als Dialog gerendert wird, fügen Sie einfach eine Schaltfläche zur XML-Datei Ihrer Aktivität hinzu.

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

Fügen Sie dann einen Klick-Listener in den Java-Code Ihrer Aktivität ein. Rufen Sie im Listener einfach anfinish()

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

Das sollte Ihren Dialog schließen und Sie zur aufrufenden Aktivität zurückkehren.


8

Wenn Sie den Aktivitätsheader entfernen und eine benutzerdefinierte Ansicht für das Dialogfeld bereitstellen möchten, fügen Sie dem Aktivitätsblock Ihres Manifests Folgendes hinzu

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

und gestalten Sie Ihr activity_layout mit der gewünschten Ansicht


2

Legen Sie das Thema in Ihrer Android-Manifest-Datei fest.

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

Stellen Sie den Dialogstatus bei Berührung ein, um den Vorgang abzuschließen.

this.setFinishOnTouchOutside(false);

1

Aktivität als Dialogfeld erstellen. Hier ist ein vollständiges Beispiel

Geben Sie hier die Bildbeschreibung ein

  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>
    

Bitte verwenden Sie keine x-großen Schriftarten, damit Ihre Antwort seltsam aussieht.
CopsOnRoad

0

Manchmal können Sie die unten angegebene Ausnahme erhalten

Auslöser: java.lang.IllegalStateException: Für diese Aktivität müssen Sie ein Theme.AppCompat-Design (oder einen Nachkommen) verwenden.

Zum Auflösen können Sie also eine einfache Lösung verwenden

Fügen Sie das Thema Ihrer Aktivität im Manifest als Dialogfeld für appCompact hinzu.

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

Es kann für jemanden hilfreich sein.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.