Gostaria de ajustar / redimensionar o layout quando o teclado virtual foi ativado, como abaixo:
Antes e depois:
Encontrou alguns recursos no SO:
- Como manter todos os campos e textos visíveis enquanto o teclado virtual é exibido
- O teclado virtual do Android estraga o layout quando aparece
- Ajustar o layout quando o teclado virtual estiver ativado
Mas as perguntas e respostas são bastante ambíguas, aqui está a pergunta com uma imagem mais clara do que eu quero.
Requisitos:
- Ele deve funcionar no telefone com qualquer tamanho de tela.
- Observe que o espaço de margem / preenchimento em "FACEBOOK" e "Inscreva-se no Facebook" mudou antes e depois.
- Nenhuma visualização de rolagem está envolvida.
Theme.AppCompat.Light.NoActionBar.FullScreen
), de acordo com esta resposta -> stackoverflow.com/a/7509285/1307690Respostas:
Basta adicionar
no seu AndroidManifest.xml, onde você declara essa atividade específica e isso ajustará a opção de redimensionamento do layout.
algum código fonte abaixo para o design do layout
fonte
Essa pergunta já foi feita há alguns anos e "Secret Andro Geni" tem uma boa explicação básica e "tir38" também fez uma boa tentativa da solução completa, mas, infelizmente, não há uma solução completa postada aqui. Passei algumas horas tentando descobrir as coisas e aqui está minha solução completa com explicações detalhadas na parte inferior:
E no AndroidManifest.xml , não se esqueça de definir:
na
<activity>
tag que você deseja esse layout.Pensamentos:
Eu percebi que
RelativeLayout
são os layouts que abrangem todo o espaço disponível e são redimensionados quando o teclado é exibido.E
LinearLayout
são layouts que não são redimensionados no processo de redimensionamento.É por isso que você precisa ter 1
RelativeLayout
imediatamente depoisScrollView
para abranger todo o espaço disponível na tela. E você precisa ter umLinearLayout
interior, casoRelativeLayout
contrário seu interior será esmagado quando o redimensionamento ocorrer. Um bom exemplo é "headerLayout". Se não houvesse umLinearLayout
interior queRelativeLayout
texto do "facebook" seria esmagado e não seria exibido.Nas imagens de login do "facebook" postadas na pergunta, também notei que toda a parte de login (mainLayout) está centrada na vertical em relação à tela inteira, daí o atributo:
no
LinearLayout
layout. E como mainLayout está dentro de um,LinearLayout
isso significa que essa parte não é redimensionada (novamente veja a figura em questão).fonte
android:layout_alignParentBottom="true"
. Isso faz com que fique no fundo.android:layout_marginBottom="15dp"
ao footerLayout e ao RelativeLayout que está segurando textView2 e helpButton . Nos dois casos, o helpButton é esmagado (mesmo sem o atributo marginBottom). De nenhuma maneira editText1 ou editText2 são esmagados, porque estão dentro de um LinearLayout . Você definiu margem em algum outro layout (não apenas no footerLayout )? Tente do zero se não estiver chegando a lugar nenhum! Você também pode jogar com oandroid:windowSoftInputMode
atributo no AndroidManifest.Adicione esta linha ao seu manifesto, onde sua atividade é chamada
ou
você pode adicionar esta linha no seu
onCreate
fonte
adjustPan
eadjustResize
. Estes são modos diferentes. Leia mais sobre eles aqui: stackoverflow.com/a/17410528/1738090 E aqui: developer.android.com/guide/topics/manifest/activity-elementO desenvolvedor do Android tem a resposta certa, mas o código-fonte fornecido é bem detalhado e não implementa o padrão descrito no diagrama.
Aqui está um modelo melhor:
Cabe a você decidir quais visualizações serão usadas nas partes "rolagem" e "rodapé". Também sei que você provavelmente terá que definir o
ScrollView
s fillViewPort .fonte
LinearLayout
s em vez de Frame e Relative, mas todas as visualizações ainda estão em cima umas das outras.Pode funcionar para todo o tipo de layout.
por exemplo:
e
por exemplo:
fonte
Isso torna possível mostrar qualquer layout desejado anteriormente oculto pelo teclado.
Adicione isso à marca de atividade no AndroidManifest.xml
Envolva sua visualização raiz com um ScrollView, de preferência com barras de rolagem = nenhuma. O ScrollView corretamente não altera nada em seu layout, exceto para ser usado para resolver esse problema.
E defina fitsSystemWindows = "true" na exibição que você deseja exibir totalmente acima do teclado. Isso tornará seu EditText visível acima do teclado e possibilitará rolar para baixo até as partes abaixo do EditText, mas na visualização com fitsSystemWindows = "true".
Por exemplo:
Se você quiser mostrar a parte completa da tela fitsSystemWindows = "true" acima do teclado no momento em que o teclado aparecer, será necessário algum código para rolar a tela para baixo:
Exemplo de layout completo:
fonte
android:fitsSystemWindows="true"
é o que me deu os resultados desejados que eu queria ... obrigadoPara aqueles que usam ConstraintLayout ,
android:windowSoftInputMode="adjustPan|adjustResize"
não funcionará.O que você pode fazer é usar um ouvinte de teclado virtual , definir restrições das visualizações de baixo para baixo nas vistas superiores e definir um viés vertical para cada vista (como uma porcentagem posicional entre restrições) como uma orientação horizontal (também posicionada por porcentagem , mas para o pai).
Para cada visualização, basta mudar
app:layout_constraintBottom_toBottomOf
para@+id/guideline
quando o teclado é mostrado , programaticamente, é claro.Geralmente, um teclado virtual ocupa não mais que 50% da altura da tela. Assim, você pode definir a diretriz para 0,5.
Agora, programaticamente, quando o teclado não é mostrado , podemos definir tudo de
app:layout_constraintBottom_toBottomOf
volta para pai, vice-versa.Chame este método:
O importante é ter certeza de definir o viés vertical de uma maneira que seja dimensionada corretamente quando o teclado for mostrado e não mostrado.
fonte
Muitas respostas estão certas. Em
AndroidManifest
eu escrevi:No meu caso, adicionei um tema
styles.xml
, mas você pode usar o seu:Notei que, se eu usar o tema de tela cheia, o redimensionamento não ocorre:
Também no meu caso
adjustResize
funciona, masadjustPan
não funciona.Para layouts de tela cheia, consulte uma solução alternativa no Android Como ajustar o layout no modo de tela cheia quando a tecla programável está visível ou em https://gist.github.com/grennis/2e3cd5f7a9238c59861015ce0a7c5584 .
Também https://medium.com/@sandeeptengale/problem-solved-3-android-full-screen-view-translucent-scrollview-adjustresize-keyboard-b0547c7ced32 funciona, mas é StatusBar transparente, portanto, bateria, relógio, Wi- Os ícones Fi são visíveis.
Se você criar uma atividade com Arquivo> Novo> Atividade> Atividade em tela cheia, em que o código é usado:
você também não alcançará um resultado. Você pode usar
android:fitsSystemWindows="true"
em um contêiner raiz, mas StatusBar aparece. Portanto, use soluções alternativas no primeiro link.fonte
No meu caso, ajudou.
main_layout.xml
Use isso no
manifest
arquivoAgora a parte mais importante! Use um tema como esse em uma das tags
Activity
ouApplication
.E o tema ficou assim
Então, eu estava sentindo falta do tema. O que me deixou frustrada o dia todo.
fonte
Você pode simplesmente definir essas opções no arquivo AndroidManifest.xml.
O uso de
adjustPan
não é recomendado pelo Google porque o usuário pode precisar fechar o teclado para ver todos os campos de entrada.Mais informações: Android App Manifest
fonte
Para mim, funcionou com esta linha de código:
Basta colocá-lo no método onCreate. Melhor!
fonte
Adicione esta linha ao arquivo mais manifesto:
fonte
Eu uso esse quadro de classe estendida E quando preciso recalcular o tamanho da altura no onLayout, substituo a medida e subtraí o keyboardHeight usando getKeyboardHeight ()
Meu quadro de criação que precisa ser redimensionado com a tecla programável
SizeNotifierFrameLayout
fonte
Este código funciona para mim. Quando o teclado aparecer, você pode rolar a tela
No AndroidManifest.xml
activity_sign_up.xml
rounded_border_edittext.xml
btn_blue_selector.xml
fonte
No Xamarin, registre o código abaixo em sua atividade
Usei um layout relativo, se você estiver usando o layout de restrições, o código acima funcionará abaixo
fonte