Estou tentando mostrar um DialogFragment quase em tela cheia. Mas de alguma forma eu não sou capaz de fazê-lo.
A maneira como mostro o fragmento é diretamente da documentação do desenvolvedor do Android
FragmentManager f = ((Activity)getContext()).getFragmentManager();
FragmentTransaction ft = f.beginTransaction();
Fragment prev = f.findFragmentByTag("dialog");
if (prev != null) {
ft.remove(prev);
}
ft.addToBackStack(null);
// Create and show the dialog.
DialogFragment newFragment = new DetailsDialogFragment();
newFragment.show(ft, "dialog");
Eu sei que ingenuamente tentei definir o RelativeLayout no fragmento para fill_parent e alguns minWidth e minHeight.
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:minWidth="1000px"
android:minHeight="600px"
android:background="#ff0000">
Eu esperaria que o DialogFragment ocupasse a maior parte da tela. Mas eu só parece redimensionar verticalmente, mas apenas até uma largura fixa horizontal.
Também tentei definir os atributos da janela no código, conforme sugerido aqui: http://groups.google.com/group/android-developers/browse_thread/thread/f0bb813f643604ec . Mas isso também não ajudou.
Provavelmente estou entendendo algo errado sobre como o Android lida com os Diálogos, pois sou novo nele. Como posso fazer algo assim? Existem maneiras alternativas de alcançar meu objetivo?
Dispositivo Android:
Asus EeePad Transformer
Android 3.0.1
Atualização: agora consegui colocá-lo em tela cheia, com o seguinte código no fragmento
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(STYLE_NO_FRAME, android.R.style.Theme_Holo_Light);
}
Infelizmente, isso não é exatamente o que eu quero. Definitivamente, preciso de um pequeno "preenchimento" ao redor da caixa de diálogo para mostrar o plano de fundo.
Alguma idéia de como fazer isso?
Respostas:
Tente mudar para um em
LinearLayout
vez deRelativeLayout
. Eu estava alvejando a API 3.0 do Honeycomb ao testar.e os layouts : fragment_dialog.xml
main.xml
fonte
Para obter o DialogFragment em tela cheia
Substitua
onStart
seu DialogFragment assim:E muito obrigado a este post: O mistério dos andróides, fragmentos de diálogo em tela cheia
fonte
ViewGroup.LayoutParams.WRAP_CONTENT
para a altura. Obrigado.fonte
De acordo com este link, o DialogFragment em tela cheia mostra estofamento nos lados. Isso funcionará como um encanto.
fonte
Crie um DialogFragment em tela cheia usando apenas o estilo
Primeira solução
1. Adicione ao seu
style.xml
:2. Adicione ao seu DialogFragment:
Solução alternativa
onde
AppTheme
é o tema que você definiu em estilos.fonte
No meu caso, usei a seguinte abordagem:
Além disso, LinearLayout para preencher todo o espaço com conteúdo.
Mas ainda havia pequenas lacunas entre as bordas esquerda e direita da caixa de diálogo e as bordas da tela em alguns dispositivos Lollipop + (por exemplo, Nexus 9).
Não era óbvio, mas finalmente descobri que, para torná-lo em largura total em todos os dispositivos e plataformas , o plano de fundo da janela deve ser especificado dentro de styles.xml, como o seguinte:
E é claro que esse estilo precisa ser usado quando criamos a caixa de diálogo da seguinte maneira:
fonte
<item name="android:windowFullscreen">true</item> <item name="android:windowIsFloating">false</item>
Fonte: TechRepublicEu já conheci o problema antes ao usar um dialogFragment em tela cheia: sempre há um preenchimento ao definir a tela inteira. tente este código no método onActivityCreated () do dialogFragment:
fonte
Na atualização da API do Android, o método sugerido para mostrar uma caixa de diálogo em tela cheia é o seguinte:
caso contrário, se você não quiser que ele seja exibido em tela cheia, faça o seguinte:
Espero que ajude.
EDITAR
Esteja ciente de que a solução que eu dei funciona, mas tem uma fraqueza que às vezes pode ser problemática. Adicionar o DialogFragment ao
android.R.id.content
contêiner não permitirá que você lide com oDialogFragment#setCancelable()
recurso corretamente e pode levar a comportamentos inesperados ao adicionar o próprio DialogFragment à pilha traseira.Então, eu sugeri que você alterasse o estilo do seu DialogFragment no método onCreate da seguinte maneira:
Espero que ajude.
fonte
Tente usar setStyle () em onCreate e substitua onCreateDialog make dialog without title
ou simplesmente substitua onCreate () e setStyle pelo código.
fonte
De fato, isso depende de como o layout é definido. Mas, para garantir que a caixa de diálogo obtenha o tamanho necessário, a melhor solução é fornecer os LayoutParams assim que a caixa de diálogo for exibida (e não na criação). Em um DialogFragment, a caixa de diálogo é mostrada no método onStart , portanto, um método válido para obter largura total é:
Para também fornecer um tema ou estilo, como um estilo NO_TITLE, a melhor localização é no método onCreate :
fonte
Nota: Mesmo um pode encontrar a resposta correta aqui. Mas quero esclarecer uma confusão.
Use o código abaixo para
android.app.DialogFragment
Use o código abaixo para
android.support.v4.app.DialogFragment
fonte
E a versão kotlin!
fonte
Esta é a solução que eu descobri esse problema:
fonte
Crie o tema abaixo em seu style.xml:
depois defina o estilo em DialogFragment
fonte
Chirag Nagariya está certo, exceto a adição '_Fullscreen'. pode ser resolvido usando qualquer estilo de base que não seja derivado do estilo de Diálogo. O 'android.R.style.Theme_Black_NoTitleBar' também pode ser usado.
fonte
Caso alguém se depare com isso, tive uma experiência semelhante a essa, mas o problema é que esqueci de retornar a exibição inflada do onCreateView (retornando o super.onCreateView padrão). Eu simplesmente retornei a visão inflada correta e isso resolveu o problema.
fonte
Esta solução aplica um tema de tela cheia na caixa de diálogo, semelhante ao setStyle de Chirag no onCreate. Uma desvantagem é que SavedInstanceState não é usado.
fonte
Tente isso para o diálogo de fragmento comum para vários usos. Espero que isso ajude você a apostar
fonte
É isso que você precisa definir para fragmentar:
No seu caso:
E porque? Como o DialogFragment (quando não informado explicitamente), usará seus estilos internos que envolverão seu layout personalizado (sem tela cheia etc.).
E layout? Nenhuma maneira hacky necessária, isso está funcionando muito bem:
Aproveitar
fonte
Estou muito atrasado para responder a essa pergunta e ainda quero compartilhar essa resposta para que no futuro alguém possa usá-la.
Eu usei esse código no meu projeto, ele funciona na versão inferior e na versão superior.
Basta usar este tema dentro de onCreateDialog () assim:
android.R.style.Theme_Black_NoTitleBar_Fullscreen - Aqui está o código-fonte para este tema, você pode ver apenas esse tema é suficiente para fazer o DialogFragment aparecer em tela cheia.
Entre em contato se alguém enfrentar algum problema. Espero que isso seja útil. Obrigado :)
fonte
A maneira a seguir funcionará mesmo se você estiver trabalhando em um layout relativo. Siga os seguintes passos:
Vá para styles.xml e, abaixo do tema adicionado, adicione estes dois atributos:
Minha configuração de tema para a caixa de diálogo é a seguinte:
Certifique-se de que o tema tenha um pai como Theme.AppCompat.Dialog. Outra maneira seria criar um novo estilo em styles.xml e alterá-lo conforme o código acima.
Vá para a classe Fragmento de Diálogo e no onCreate () método , defina o estilo do Dialog como:
@Override public void onCreate (@Nullable Bundle savedInstanceState) {super.onCreate (savedInstanceState); setStyle (DialogFragment.STYLE_NORMAL, R.style.DialogTheme); }
fonte
Adicione isso abaixo das linhas no estilo da caixa de diálogo de tela cheia.
fonte
window.setLayout
não é suficiente para dispositivos mais antigos.Aqui está o que eu faço:
fonte
fonte
Uma solução usando o novo
ConstraintLayout
é agrupar oConstraintLayout
em umLinearLayout
com minHeight e minWidth corrigidos. Sem o agrupamento, o ConstraintLayout não está obtendo o tamanho certo para o Diálogo.fonte
Trabalhou para mim em Kotlin,
fonte
a seguinte solução funcionou para mim outra solução me deu algum espaço nas laterais ou seja, não em tela cheia
Você precisa fazer alterações nos métodos onStart e onCreate
fonte