Eu especifico o layout do meu DialogFragment em um arquivo de layout xml (vamos chamá-lo layout_mydialogfragment.xml
), e seus atributos layout_width
e layout_height
particularmente ( 100dp
cada um, digamos). Em seguida, inflo esse layout no onCreateView(...)
método do meu DialogFragment da seguinte maneira:
View view = inflater.inflate(R.layout.layout_mydialogfragment, container, false);
Infelizmente, acho que quando minha caixa de diálogo (DialogFragment) aparece, ela não respeita layout_width
e é layout_height
especificada em seu arquivo de layout xml (e minha caixa de diálogo diminui ou se expande de maneira variável, dependendo do conteúdo). Alguém sabe se ou como posso fazer com que minha caixa de diálogo respeite layout_width
e layout_height
especifique em seu arquivo de layout xml? No momento, estou precisando especificar a largura e a altura da minha caixa de diálogo novamente no onResume()
método do meu DialogFragment da seguinte maneira ...
getDialog().getWindow().setLayout(width, height);
... E, portanto, indesejávelmente, lembre-se de fazer alterações futuras na largura e altura da caixa de diálogo em dois lugares.
fonte
Respostas:
Se você converter diretamente dos valores dos recursos:
Em seguida, especifique match_parent no seu layout para a caixa de diálogo:
Você só precisa se preocupar com um lugar (coloque-o no seu
DialogFragment#onResume
). Não é perfeito, mas pelo menos funciona para ter um RelativeLayout como a raiz do arquivo de layout da sua caixa de diálogo.fonte
RelativeLayout
e isso me ajudou. Muito obrigado pela solução - isso me salvou muito tempo.onResume()
, nãoonCreateView()
. (Meu layout raiz é RelativeLayout envolto em um ScrollView.)int width = getResources().getDisplayMetrics().widthPixels
onCreateDialog()
. Precisa estar emonResume()
.Acabei substituindo
Fragment.onResume()
e pegando os atributos da caixa de diálogo subjacente e definindo parâmetros de largura / altura lá. Defino a altura / largura do layout mais externo paramatch_parent
. Observe que esse código parece respeitar também as margens que eu defini no layout xml.fonte
(android.view.WindowManager.LayoutParams)
, o que você está lançando? Fiquei intrigado ao escolher a importação correta paraLayoutParams
aparecer nas três primeiras linhas da função. Acabou escolhendo(android.view.WindowManager.LayoutParams)
. Isso deveria estar correto?android.view.WindowManager.LayoutParams
, é inútil usarViewGroup.LayoutParams
três linhas acima ... Você não ganha flexibilidade aqui. Seja como for, obrigado por esta boa resposta!Eu recebi um DialogFragment de tamanho fixo, definindo o seguinte no layout principal do XML (LinearLayout no meu caso):
fonte
A única coisa que funcionou no meu caso foi a solução apontada aqui: http://adilatwork.blogspot.mx/2012/11/android-dialogfragment-dialog-sizing.html
Snippet da postagem do blog da Adil:
fonte
getDialog().getWindow().setLayout(dialogWidth, dialogHeight);
funciona perfeitamente para um DialogFragment. Mas eu não entendo a verificação de segurança. por que nós temos que verificarnull
?Dialog
(filho doDialogFragment
) estará disponível no momento em que for solicitado. É possível que o Android retorne nulo quando ligarmosgetDialog()
.Uma maneira de controlar a
DialogFragment
largura e a altura da sua pessoa é garantir que a caixa de diálogo respeite a largura e a altura da visualização, se o valor for esseWRAP_CONTENT
.Usando
ThemeOverlay.AppCompat.Dialog
Uma maneira simples de conseguir isso é usar o
ThemeOverlay.AppCompat.Dialog
estilo incluído na Biblioteca de Suporte do Android.DialogFragment
comDialog
:DialogFragment
comAlertDialog
(ressalva :)minHeight="48dp"
:Você também pode definir
ThemeOverlay.AppCompat.Dialog
como tema padrão ao criar suas caixas de diálogo, adicionando-o ao tema xml do seu aplicativo.Tenha cuidado, pois muitas caixas de diálogo precisam da largura mínima padrão para parecerem boas.
DialogFragment
comDialog
, utilizandoandroid:dialogTheme
:DialogFragment
comAlertDialog
, utilizandoandroid:alertDialogTheme
oualertDialogTheme
(ressalva :)minHeight="48dp"
:Bônus
Nas APIs mais antigas do Android,
Dialog
s parecem ter alguns problemas de largura devido ao título (mesmo se você não definir um).Se você não deseja usar o
ThemeOverlay.AppCompat.Dialog
estilo eDialog
não precisa de um título (ou tem um personalizado), convém desativá-lo:Resposta desatualizada, não funcionará na maioria dos casos
Eu estava tentando fazer com que a caixa de diálogo respeitasse a largura e a altura do meu layout, sem especificar um tamanho fixo programaticamente.
Eu percebi isso
android:windowMinWidthMinor
eandroid:windowMinWidthMajor
estava causando o problema. Mesmo que não tenham sido incluídos no tema do meuActivity
orDialog
, ainda estavam sendo aplicados aoActivity
tema, de alguma forma.Eu vim com três soluções possíveis.
Solução 1: crie um tema de diálogo personalizado e use-o ao criar o diálogo no
DialogFragment
.Solução 2: crie um tema personalizado para ser usado em um
ContextThemeWrapper
que servirá comoContext
para o diálogo. Use isso se você não desejar criar um tema de diálogo personalizado (por exemplo, quando desejar usar o tema especificado porandroid:dialogTheme
).Solução 3 (com um
AlertDialog
): aplicarandroid:windowMinWidthMinor
e criarandroid:windowMinWidthMajor
oContextThemeWrapper
criado peloAlertDialog$Builder
.fonte
Theme.MaterialComponents.Light.Dialog
como pai e usei esse estilo no construtor deMaterialAlertDialogBuilder
. Encontrei sua resposta após uma pesquisa de 1 hora. Obrigado e polegares para cima.Pegadinha 13:
DialogFragment
layoutsÉ meio que entorpecente mesmo.
Ao criar um
DialogFragment
, você pode optar por substituironCreateView
(que passa por umViewGroup
para anexar o layout .xml) ouonCreateDialog
que não.A escolha de substituir
OnCreateDialog
ouOnCreateView
depende de como você pretende usar a caixa de diálogo.OnCreateDialog
.OnCreateView
.Esta é possivelmente a pior coisa do mundo.
onCreateDialog
InsanidadePortanto, você está substituindo o
onCreateDialog
seuDialogFragment
para criar uma instância personalizadaAlertDialog
para exibir em uma janela. Legal. Mas lembre-se,onCreateDialog
não recebeViewGroup
para anexar o costume .xml disposição para . Não tem problema, você simplesmente passanull
para oinflate
métodoQue a loucura comece.
Quando você substitui
onCreateDialog
, o Android ignora completamente vários atributos do nó raiz do layout .xml inflado. Isso inclui, mas provavelmente não está limitado a:background_color
layout_gravity
layout_width
layout_height
Apenas a palavra
DialogFragment
me faz querer vomitar. Eu poderia escrever um romance cheio de truques e snafus para Android, mas este é um dos mais íntimos.Para retornar à sanidade, primeiro declaramos um estilo para restaurar APENAS o
background_color
elayout_gravity
esperamos:O estilo acima herda do tema base para caixas de diálogo (no
AppCompat
tema neste exemplo).Em seguida, aplicamos o estilo programaticamente para colocar de volta os valores que o Android acabou de deixar de lado e restaurar a
AlertDialog
aparência padrão :O código acima fará com que você
AlertDialog
pareçaAlertDialog
novamente. Talvez isso seja bom o suficiente.Mas espere, tem mais!
Se você estiver olhando para definir um ESPECÍFICA
layout_width
oulayout_height
para o seuAlertDialog
quando ele é mostrado (muito provável), então acho que, você não é feito ainda!A alegria continua quando você percebe que, se você tentar definir um estilo específico
layout_width
oulayout_height
do seu novo estilo, o Android ignorará isso também !:Para definir a largura ou a altura de uma janela ESPECÍFICA, siga para um método completo e lide com
LayoutParams
:Em suma
Para
DialogFragment
s que substituemonCreateDialog
:AlertDialog
aparência padrão , crie um estilo que definabackground_color
=transparent
elayout_gravity
=center
e aplique esse estiloonCreateDialog
.layout_width
e / oulayout_height
, faça-o programaticamenteonResume
comLayoutParams
fonte
Quando preciso tornar o DialogFragment um pouco mais amplo, estou definindo minWidth:
fonte
Eu não vejo uma razão convincente para substituir
onResume
ouonStart
para definir a largura e altura doWindow
interiorDialogFragment
'sDialog
- estes métodos de ciclo de vida particulares podem obter chamado repetidamente e desnecessariamente executar esse redimensionamento código mais de uma vez devido a coisas como a janela de comutação multi, backgrounding em primeiro plano o aplicativo e assim por diante. As consequências dessa repetição são bastante triviais, mas por que se contentar com isso?Definir a largura / altura em vez de um
onActivityCreated()
método substituído será uma melhoria, pois esse método realisticamente só é chamado uma vez por instância do seuDialogFragment
. Por exemplo:Acima, apenas defino a largura
match_parent
independentemente da orientação do dispositivo. Se você deseja que a caixa de diálogo paisagem não seja tão ampla, verifique comgetResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT
antecedência.fonte
A dimensão no layout mais externo não funciona na caixa de diálogo. Você pode adicionar um layout em que defina a dimensão abaixo da mais externa.
fonte
Corrigi-o definindo os parâmetros de layout do elemento raiz.
fonte
Aqui está uma maneira de definir a largura / altura do DialogFragment em xml. Apenas envolva sua viewHierarchy em um Framelayout (qualquer layout funcionará) com um plano de fundo transparente.
Um plano de fundo transparente parece ser um sinalizador especial, porque centraliza automaticamente o filho do frameLayout na janela quando você faz isso. Você ainda terá a tela cheia escurecendo atrás do seu fragmento, indicando que ele é o elemento ativo.
fonte
Aqui está a versão kotlin
fonte
Você pode usar porcentagem para largura.
Eu usei o Holo Theme para este exemplo.
fonte
Você pode codificar abaixo para definir a largura e a altura do layout do java.
fonte
Eu crio a caixa de diálogo usando AlertDialog.Builder, então usei a resposta de Rodrigo dentro de um OnShowListener.
fonte
Snicolas
na discussão de "DialogFragment
vsAlertDialog
" em stackoverflow.com/a/7979823/3372061 .Trabalhando no Android 6.0, ocorreu o mesmo problema.
AlertDialog
teria como padrão owidth
conjunto predefinido no tema, independentemente dowidth
conjunto real na raiz da visualização personalizadaLayout
. Consegui fazê-lo para ajustar corretamentewidth
oloading_message
TextView
. Sem investigar mais, parece que dimensionar os elementos reais e colocar a raiz emLayout
volta deles faz com que funcione conforme o esperado. Abaixo está um layout XML de uma caixa de diálogo de carregamento, que definewidth
corretamente a caixa de diálogo. Usando a biblioteca this para a animação.fonte
Fácil e sólido:
fonte
No meu caso,
DialogFragment
ocupava o tamanho total da atividade como aFragment
. ODialogFragment
foi baseado no layout XML, nãoAlertDialog
. Meu erro foi adicionar o fragmento de diálogoFragmentManager
como um fragmento usual:Em vez disso, preciso
show
do fragmento de diálogo:Após algumas edições (eu tenho
ViewPager2
no layout), o fragmento de diálogo ficou muito estreito:Eu usei a solução de N1hk :
Agora, ele definiu largura e altura, não o tamanho total da atividade.
Eu quero dizer sobre
onCreateView
eonCreateDialog
. Se você tiver um fragmento de diálogo com base no layout, poderá usar qualquer um desses 2 métodos.1) Se você usar
onCreateView
, deveráonActivityCreated
definir a largura.2) Se você usar em
onCreateDialog
vez deonCreateView
, poderá definir parâmetros lá.onActivityCreated
não será necessário.fonte
No meu caso, foi causado por
align_parentBottom="true"
uma visualização dentro de aRelativeLayout
. Removidos todos os alignParentBottom e alterados todos os layouts para LinearLayouts verticais, e o problema desapareceu.fonte
Defina o layout pai do layout de diálogo personalizado como RelativeLayout , obtenha largura e altura comuns automaticamente.
fonte
Uma das soluções anteriores quase funcionou. Eu tentei algo um pouco diferente e acabou funcionando para mim.
(Certifique-se de olhar para a solução dele) Esta foi a solução dele. Clique aqui Funcionou, exceto: builder.getContext (). GetTheme (). ApplyStyle (R.style.Theme_Window_NoMinWidth, true);
Eu mudei para
A última linha é o que realmente é diferente.
fonte
fonte
Esta é a solução mais simples
A melhor solução que encontrei é substituir em
onCreateDialog()
vez deonCreateView()
. setContentView () definirá as dimensões corretas da janela antes de inflar. Isso elimina a necessidade de armazenar / definir uma dimensão, cor de plano de fundo, estilo etc. nos arquivos de recursos e configurá-los manualmente.fonte
Adicione ao seu
FragmentDialog
:fonte
Isso funcionará perfeitamente.
fonte
Para obter uma caixa de diálogo que cobre quase todos os seixos: Primeiro defina uma classe ScreenParameter
Então você precisa chamar o ScreenParamater antes do método getDialog.getWindow (). SetLayout ()
fonte