Attività Android come finestra di dialogo


Risposte:


546

Per iniziare l'attività come finestra di dialogo, l'ho definita in questo modo in AndroidManifest.xml:

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

Utilizzare questa proprietà all'interno del activitytag per evitare che la finestra di dialogo venga visualizzata nell'elenco delle app utilizzate di recente

android:excludeFromRecents="true"

Se si desidera interrompere la distruzione della finestra di dialogo / attività quando l'utente fa clic all'esterno della finestra di dialogo:

Dopo setContentView()l' Activityuso:

this.setFinishOnTouchOutside(false);

Ora quando chiamo startActivity()viene visualizzato come una finestra di dialogo, con l'attività precedente mostrata quando l'utente preme il pulsante Indietro.

Nota che se stai usando ActionBarActivity(o tema AppCompat), dovrai @style/Theme.AppCompat.Dialoginvece usarlo .


186
Usando android: theme = "@ android: style / Theme.Dialog" è la strada da percorrere ma non dimenticare di usare excludeFromRecents = true oppure la tua finestra di dialogo apparirà nelle App utilizzate di recente (tieni premuto il tasto Home).
Emmanuel,

7
ho delle difficoltà legate all'attività come finestra di dialogo .. ho fatto l'attività come finestra di dialogo ma il problema è quando faccio clic all'esterno dell'attività che si chiude automaticamente .. ??? c'è qualche soluzione correlata a questo .. ??????
Wolverine,

7
@Emmanuel, deve essere android: excludeFromRecents = "true" annota le doppie virgolette
Sandeep

43
Si noti che se si utilizza ActionBarActivity (o tema AppCompat), è necessario utilizzare@style/Theme.AppCompat.Dialog
Quentin Klein,

8
@Wolverine, Aggiungi metodo this.setFinishOnTouchOutside(false);dopo setContentView()per evitare che l'attività venga distrutta quando si fa clic al di fuori della finestra di dialogo creata.
Anggrayudi H,

43

Utilizzare questo codice in modo che l'attività della finestra di dialogo non venga chiusa quando l'utente tocca all'esterno della finestra di dialogo:

this.setFinishOnTouchOutside(false);

richiede il livello API 11


1
Esiste una soluzione per API <11?
PK Gupta,

@pkgupta, se è accettabile per te, non dovresti preoccuparti almeno dell'API <15 per me poiché non ci sono molte persone che usano comunque quelle versioni precedenti. In effetti, a partire dal 2017, penso che 19 o 20 siano i nuovi minSDK.
Neon Warge,

28

Puoi definire questo stile in valori / styles.xml per eseguire una Splash più precedente:

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

E usalo AndroidManifest.xml:

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

2
ri @drawable/trans: dovresti essere in grado di usare @android:color/transparentciò che creerebbe un ColorDrawableda usare come sfondo.
TWiStErRob,

1
<item name = "android: windowBackground"> ​​@ null </item> è un'altra alternativa
TouchBoarder,

Il problema è che l'attività sta riempiendo l'intero schermo ma non viene visualizzata come sovrapposizione di dialogo.
Shajeel Afzal,

È <item name="windowNoTitle">true</item> (nessun "androide"). Vedi qui . Non sono sicuro degli altri articoli.
Gary99,

23

1 - È possibile utilizzare la stessa attività di dialogo e schermo intero, in modo dinamico:

Chiama setTheme(android.R.style.Theme_Dialog)prima di chiamare setContentView(...)e super.oncreate()nella tua attività.

2 - Se non prevedi di cambiare lo stile del tema dell'attività, puoi usarlo

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

(come menzionato da @faisal khan)


Solo una nota: quando uso il metodo programmatico (il primo metodo), tutto dietro la finestra di dialogo viene oscurato completamente; questo non era un problema nell'altro metodo però. Peccato ... Volevo davvero farlo programmaticamente .... Nexus 5, Android 6.0.1
Eric

@Eric hai trovato la soluzione per oscurare ??
Anand

1
@anand sì, combinando le due soluzioni insieme di risolvere il problema blackout: tema insieme di attività a un tema di dialogo in palese Android ( <activity android:theme="@android:style/Theme.Dialog" />) e il tema di programmazione serie di attività da una finestra o un'attività in onCreate stackoverflow.com/a/35915764/2898715
Eric,

21

Se hai bisogno della versione di 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>

Questo è fantastico Avevo bisogno di rimuovere la barra delle azioni. Ho dovuto modificare leggermente l'XML però. Ho dovuto aggiungere <item name="windowNoTitle">true</item>per farlo funzionare per me. Ho anche aggiunto <item name="android:windowActionBar">false</item>per buona misura.
Eric

5
Anche per me <item name="android:windowNoTitle">true</item>non ha funzionato (Android 5.0.1) e ho dovuto passare a<item name="windowNoTitle">true</item>
noti il

17

Se la tua attività viene visualizzata come una finestra di dialogo, aggiungi semplicemente un pulsante all'xml della tua attività,

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

Quindi collegare un listener di clic nel codice Java dell'attività. Nell'ascoltatore, chiama semplicementefinish()

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

Ciò dovrebbe chiudere la finestra di dialogo, riportandoti all'attività di chiamata.


8

Se si desidera rimuovere l'intestazione dell'attività e fornire una vista personalizzata per la finestra di dialogo, aggiungere quanto segue al blocco attività di manifest

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

e progetta il tuo activity_layout con la vista desiderata


2

Imposta il tema nel tuo file manifest Android.

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

E imposta lo stato della finestra di dialogo al tocco per terminare.

this.setFinishOnTouchOutside(false);

1

Crea attività come finestra di dialogo, ecco un esempio completo

inserisci qui la descrizione dell'immagine

  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>

Si prega di non utilizzare caratteri di grandi dimensioni per rendere strana la risposta.
CopsOnRoad

0

Alcune volte è possibile ottenere l'eccezione fornita di seguito

Causato da: java.lang.IllegalStateException: è necessario utilizzare un tema Theme.AppCompat (o discendente) con questa attività.

Quindi per risolvere puoi usare una soluzione semplice

aggiungi il tema della tua attività in manifest come finestra di dialogo per appCompact.

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

Può essere utile per qualcuno.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.