Atividade do Android como uma caixa de diálogo


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.


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


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

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)


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>

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.


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


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

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>

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.