Atividade do Android como uma caixa de diálogo

257

Eu tenho uma atividade chamada whereActityque também tem diálogos filhos. Agora, desejo exibir esta atividade como um diálogo para outra atividade.

Como eu posso fazer isso?

insira a descrição da imagem aqui

d-man
fonte
Se você quiser apenas de diálogo de carregamento, você pode usar ProgressDialog
Daksh Agrawal

Respostas:

546

Para iniciar a atividade como caixa de diálogo, eu a defini assim em AndroidManifest.xml:

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

Use esta propriedade dentro de sua activitytag para evitar que sua caixa de diálogo apareça na lista de aplicativos usados ​​recentemente

android:excludeFromRecents="true"

Se você deseja impedir que sua caixa de diálogo / atividade seja destruída quando o usuário clica fora da caixa de diálogo:

Após o setContentView()seu Activityuso:

this.setFinishOnTouchOutside(false);

Agora, quando ligo, startActivity()é exibido como uma caixa de diálogo, com a atividade anterior mostrada quando o usuário pressiona o botão Voltar.

Observe que se você estiver usando ActionBarActivity(ou tema do AppCompat), será necessário usá-lo @style/Theme.AppCompat.Dialog.

d-man
fonte
186
Usando o android: theme = "@ android: style / Theme.Dialog" é o caminho a seguir, mas não se esqueça de usar excludeFromRecents = true; caso contrário, sua caixa de diálogo aparecerá nos Aplicativos usados ​​recentemente (mantenha pressionada a tecla Início).
Emmanuel
7
Eu tenho dificuldade relacionada à atividade como caixa de diálogo .. Eu fiz a atividade como caixa de diálogo, mas o problema é quando clico fora da atividade que ela é fechada automaticamente .. ??? existe alguma solução relacionada a isso .. ??????
Wolverine
7
@Emmanuel, ele tem que ser android: excludeFromRecents = "true", note as aspas duplas
Sandeep
43
Note que se você estiver usando ActionBarActivity (ou AppCompat tema), você vai precisar usar@style/Theme.AppCompat.Dialog
Quentin Klein
8
@Wolverine, Adicionar this.setFinishOnTouchOutside(false);depois do setContentView()método para impedir que a atividade seja destruída quando você clica fora da caixa de diálogo criada.
Anggrayudi H
43

Use este código para que a atividade da caixa de diálogo não seja fechada quando o usuário tocar fora da caixa de diálogo:

this.setFinishOnTouchOutside(false);

requer API nível 11

Maverick
fonte
1
Existe alguma solução para API <11?
PK Gupta
@pkgupta, se for aceitável para você, você não deve se preocupar com pelo menos a API <15 para mim, pois não há muita gente usando essas versões anteriores. De fato, a partir de 2017, acho que 19 ou 20 é o novo minSDK.
Neon Warge
28

Você pode definir esse estilo em values ​​/ styles.xml para executar um Splash mais antigo:

   <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 use-o AndroidManifest.xml:

   <activity android:name=".SplashActivity"
          android:configChanges="orientation"
          android:screenOrientation="sensor"
          android:theme="@style/Theme.UserDialog">
herbertD
fonte
2
re @drawable/trans: você deve poder usar o @android:color/transparentque criaria um ColorDrawablepara usar como plano de fundo.
TWiStErRob
1
<item name = "android: windowBackground"> ​​@ null </item> é outra alternativa
TouchBoarder
O problema é que a atividade está preenchendo a tela inteira, mas não aparece como sobreposição de diálogo.
Shajeel Afzal 04/08/2015
É <item name="windowNoTitle">true</item> (não "android"). Veja aqui . Não tenho certeza sobre os outros itens.
precisa saber é o seguinte
23

1 - Você pode usar a mesma atividade que tanto a caixa de diálogo quanto a tela cheia, dinamicamente:

Ligue setTheme(android.R.style.Theme_Dialog)antes de ligar setContentView(...)e super.oncreate()em sua Atividade.

2 - Se você não planeja alterar o estilo do tema da atividade, pode usar

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

(como mencionado por @faisal khan)

M. Usman Khan
fonte
Apenas uma observação: quando eu uso o método programático (o primeiro método), tudo atrás da caixa de diálogo fica completamente oculto; isso não foi um problema no outro método. Muito ruim ... Eu realmente queria fazer isso programaticamente .... Nexus 5, Android 6.0.1
Eric
@ Eric encontrou solução para apagado?
Anand
1
@anand sim, combinar as duas soluções juntos corrige o problema de blecaute: defina o tema da atividade como um tema de diálogo no manifesto do Android ( <activity android:theme="@android:style/Theme.Dialog" />) e defina programaticamente o tema da atividade como um diálogo ou uma atividade no onCreate stackoverflow.com/a/35915764/2898715
Eric
21

Se você precisar da versão 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
fonte
Isso é ótimo. Eu precisava remover a barra de ação. Eu tive que modificar o XML um pouco. Eu tive que adicionar <item name="windowNoTitle">true</item>para fazer o trabalho para mim. Eu também adicionei <item name="android:windowActionBar">false</item>para uma boa medida.
Eric
5
Também para mim <item name="android:windowNoTitle">true</item>não funcionou (Android 5.0.1), e eu tive que mudar para<item name="windowNoTitle">true</item>
noti
17

Se sua atividade estiver sendo renderizada como uma caixa de diálogo, basta adicionar um botão ao xml da sua atividade,

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

Em seguida, anexe um ouvinte de clique no código Java da sua atividade. No ouvinte, basta chamarfinish()

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

Isso deve descartar sua caixa de diálogo, retornando você à atividade de chamada.

aaronsnoswell
fonte
8

Se você deseja remover o cabeçalho da atividade e fornecer uma exibição personalizada para a caixa de diálogo, adicione o seguinte ao bloco de atividades do seu manifesto

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

e projete seu Activity_layout com a visualização desejada

Ismail Iqbal
fonte
2

Defina o tema no seu arquivo de manifesto do Android.

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

E defina o estado da caixa de diálogo ao toque para finalizar.

this.setFinishOnTouchOutside(false);
Gyan Swaroop Awasthi
fonte
1

Criar atividade como caixa de diálogo. Aqui está um exemplo completo

insira a descrição da imagem aqui

  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
fonte
Por favor, não use fontes x-large para fazer sua resposta parecer estranha.
CopsOnRoad 9/04
0

Algumas vezes você pode obter a exceção que é dada abaixo

Causado por: java.lang.IllegalStateException: você precisa usar um tema Theme.AppCompat (ou descendente) com esta atividade.

Então, para resolver, você pode usar uma solução simples

adicione o tema da sua atividade no manifesto como caixa de diálogo para appCompact.

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

Pode ser útil para alguém.

Gyan Swaroop Awasthi
fonte