Como posso obter uma janela de atividade no estilo da caixa de diálogo para preencher a tela?

142

Estou usando uma atividade com o tema do diálogo definido e quero que seja em tela cheia. Eu tentei todo tipo de coisa, mesmo passando pelo WindowManager para expandir a janela para largura e altura manualmente, mas nada funciona.

Aparentemente, uma janela de diálogo (ou uma atividade com o tema da caixa de diálogo) será expandida apenas de acordo com seu conteúdo, mas mesmo isso nem sempre funciona. Por exemplo, mostro um círculo da barra de progresso com largura e altura definidas como FILL_PARENT (o mesmo acontece com o contêiner de layout), mas ainda assim, a caixa de diálogo envolve a barra de progresso muito menor, em vez de preencher a tela.

Deve haver uma maneira de exibir algo pequeno dentro de uma janela de diálogo, mas ele deve ser expandido para o tamanho de tela inteira sem que o conteúdo também seja redimensionado?

Matthias
fonte
2
Nota interessante: ao definir a largura e a altura do contêiner de layout para um valor real em pixels, a caixa de diálogo é redimensionada de acordo. Mas quando defini-lo como FILL_PARENT, então não faz ...
Matthias
Realmente? O layout que a atividade está instanciando, possui uma tag Relative ou LinearLayout pai definida para altura e largura de fill_parent? Eu implementei algumas atividades com um tema de diálogo e nunca tive problema em ocupar a tela inteira.
MattC
Sim, a atividade tem um LinearLayout definido como FILL_PARENT para largura e altura.
Matthias
Eu meio que resolvi o problema usando uma solução alternativa, mas como essa não é uma boa solução, deixarei a pergunta em aberto. O que fiz foi subclassificar LinearLayout e substituir o método onMeasure (), responsável por determinar o tamanho da visualização durante um ciclo de layout e corrigi-lo na largura e altura da tela. Porém, isso não está correto, já que isso não leva em conta o espaço ocupado pelas barras de menus, portanto o contêiner será mais alto do que parece na tela (com todos os efeitos colaterais estranhos, como crianças desaparecendo em áreas não visíveis da tela). a tela).
Matthias
Encontrei a solução correta, veja minha resposta abaixo.
Matthias

Respostas:

312

Encontrei a solução:

Na sua atividade que possui o Theme.Dialogestilo definido, faça o seguinte:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.your_layout);

    getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
}

É importante que você ligue Window.setLayout() depois de ligar setContentView(), caso contrário não funcionará.

Matthias
fonte
5
Obrigado, economizei meu tempo, em nenhum lugar eu teria descoberto isso! mas qualquer idéia de por que precisamos especificar explicitamente no código, por que fill_parent não funciona no xml para atividades com diálogo de tema?
sáb em
3
Minha caixa de diálogo não preencherá a largura, nem por XML nem por esse método. Estou comendo minhas unhas.
eitama
6
E é:import android.view.ViewGroup.LayoutParams;
11
FILL_PARENT está obsoleto agora, use MATCH_PARENT em vez disso
AlexV 28/02
4
Não está preenchendo a tela inteira, é como se tivesse um pequeno preenchimento em cada lado.
Machado
66

Você pode adicionar esses valores ao seu estilo android: windowMinWidthMajor e android: windowMinWidthMinor

<style name="Theme_Dialog" parent="android:Theme.Holo.Dialog">
    ...
    <item name="android:windowMinWidthMajor">97%</item>
    <item name="android:windowMinWidthMinor">97%</item>
</style>
Serhii Nadolynskyi
fonte
2
solução mais fácil. Também está trabalhando com a biblioteca de suporte appcompat. Obrigado.
Muhammad Saqib
Essa resposta deve ser aceita. A maneira mais adequada e limpa de fazer isso. Considere usar parent = "@ style / Theme.AppCompat.Light.Dialog"
Kirill Karmazin
Parece que deve funcionar, mas não funciona para mim. Hmm, eu me pergunto o porquê. Talvez as coisas tenham mudado desde 2014.
Scott Biggs
53

Eu só quero preencher apenas 80% da tela para o que fiz assim abaixo

        DisplayMetrics metrics = getResources().getDisplayMetrics();
        int screenWidth = (int) (metrics.widthPixels * 0.80);

        setContentView(R.layout.mylayout);

        getWindow().setLayout(screenWidth, LayoutParams.WRAP_CONTENT); //set below the setContentview

funciona apenas quando coloco a linha getwindow (). setLayout ... abaixo do setContentView (..)

obrigado @Matthias

Padma Kumar
fonte
11

Embrulhe seu dialog_custom_layout.xml em RelativeLayout em vez de qualquer outro layout. Isso funcionou para mim.

Ayan
fonte
1
O mesmo aqui, Largura e Altura estavam completamente errados e não conseguiam descobrir como consertar. A conversão do layout raiz em um RelativeLayout também corrigiu meus problemas!
SharpMobileCode
8

Para caixa de diálogo Isso pode ser útil para alguém. Eu quero uma caixa de diálogo para ter largura total da tela. procurou muito, mas nada foi útil. Finalmente, isso funcionou para mim:

mDialog.setContentView(R.layout.my_custom_dialog);
mDialog.getWindow().setBackgroundDrawable(null);

depois de adicionar isso, minha caixa de diálogo aparece em toda a largura da tela.

Rahul Sharma
fonte
5

Esta resposta é uma solução alternativa para aqueles que usam "Theme.AppCompat.Dialog" ou qualquer outro descendente "Theme.AppCompat.Dialog" como "Theme.AppCompat.Light.Dialog", "Theme.AppCompat.DayNight.Dialog", etc. Eu próprio tenho que usar a caixa de diálogo AppCompat porque uso AppCompatActivity como se estende a todas as minhas atividades. Haverá um problema que fará com que o diálogo tenha preenchimento por todos os lados (superior, direito, inferior e esquerdo) se usarmos a resposta aceita.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.your_layout);

    getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
}

No estilo da sua atividade, adicione estes códigos

<style name="DialogActivityTheme" parent="Theme.AppCompat.Dialog">
    <item name="windowNoTitle">true</item>
    <item name="android:windowBackground">@null</item>
</style>

Como você pode notar, o problema que gera preenchimento para a nossa caixa de diálogo é "android: windowBackground", então aqui faço com que o plano de fundo da janela seja nulo.

HendraWD
fonte
2

Defina uma largura mínima no layout superior.

android:minWidth="300dp"

Por exemplo:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"
  xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="300dp">

<!-- Put remaining contents here -->

</LinearLayout>
Roy Matthew
fonte
2

A resposta de Matthias está certa, mas ainda não está preenchendo a tela inteira, pois possui um pequeno preenchimento em cada lado (apontado por @Holmes). Além do código, podemos corrigir isso estendendo o estilo Theme.Dialog e adicionando alguns atributos como este.

<style name="MyDialog" parent="@android:style/Theme.Dialog">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowNoTitle">true</item>
</style>

Simplesmente declaramos Atividade com o tema definido como MyDialog:

<activity
    android:name=".FooActivity"
    android:theme="@style/MyDialog" />
DYS
fonte
1

Isso seria útil para alguém como eu. Crie um estilo de diálogo personalizado:

<style name="MyDialog" parent="Theme.AppCompat.Light.Dialog">
    <item name="windowNoTitle">true</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowIsFloating">false</item>
</style>

No AndroidManifest.xmltema do conjunto de arquivos para a atividade desejada:

<activity
        android:name=".CustomDialog"
        ...
        android:theme="@style/MyDialog"/>

Isso é tudo, não há necessidade de chamar métodos programaticamente.

Stanojkovic
fonte
ainda mostram estofamento em cada lado (topo, direita, baixo e da esquerda) e se precisamos mostrar barra de status também, esta solução irá falhar
HendraWD
Verifique stackoverflow.com/a/39590004/3940133 se você tem estofamento em cada lado
HendraWD
0

No seu arquivo de manifesto onde nossa atividade é definida

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

sem barra de ação

<activity android:name=".YourPopUpActivity"
            android:theme="@android:style/Theme.Holo.Dialog.NoActionBar"/>
Makvin
fonte