Sempre que o teclado do software aparece, ele redimensiona a imagem de fundo. Consulte a captura de tela abaixo:
Como você pode ver, o fundo é meio espremido. Qualquer pessoa pode esclarecer por que o fundo é redimensionado?
Meu layout é o seguinte:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/page_bg"
android:isScrollContainer="false"
>
<LinearLayout android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_width="fill_parent"
>
<EditText android:id="@+id/CatName"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:inputType="textCapSentences"
android:lines="1"
/>
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/save"
android:onClick="saveCat"
/>
</LinearLayout>
<ImageButton
android:id="@+id/add_totalk"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:background="@null"
android:src="@drawable/add_small"
android:scaleType="center"
android:onClick="createToTalk"
android:layout_marginTop="5dp"
/>
</LinearLayout>
android
view
android-linearlayout
Andreas Wong
fonte
fonte
Eu enfrentei o mesmo problema ao desenvolver um aplicativo de bate-papo, tela de bate-papo com uma imagem de fundo.
android:windowSoftInputMode="adjustResize"
apertou minha imagem de plano de fundo para ajustar o espaço disponível após a exibição do teclado virtual e "AdjustPan" mudou todo o layout para ajustar o teclado virtual. A solução para esse problema foi definir o plano de fundo da janela em vez de um plano de layout dentro de um XML de atividade. UsegetWindow().setBackgroundDrawable()
em sua atividade.fonte
Aqui está a melhor solução para evitar esse tipo de problema.
Etapa 1: criar um estilo
Etapa 2: defina seu estilo de atividade no
AndroidManifest
arquivofonte
Através do android: windowSoftInputMode = "AdjustPan", fornecendo uma experiência ruim ao usuário, porque a tela inteira fica em cima (mude para o topo). Portanto, seguir é uma das melhores respostas.
Eu tenho o mesmo problema, mas depois disso, encontrei respostas impressionantes do @Gem
Em manifesto
Em xml
Não defina nenhum plano de fundo aqui e mantenha sua visualização em ScrollView
Em Java
Você precisa definir o plano de fundo para a janela:
Graças ao @Gem.
fonte
apenas para adição ...
se você tem uma listview em sua atividade, você precisa adicionar este
android:isScrollContainer="false"
nas propriedades da sua exibição de lista ...e não se esqueça de adicionar
android:windowSoftInputMode="adjustPan"
seu xml de manifesto à sua atividade ...se vocês estão usando
android:windowSoftInputMode="adjustUnspecified"
com a exibição rolável em seu layout, o plano de fundo ainda será redimensionado pelo teclado virtual ...seria melhor se você usasse o valor "AdjustPan" para impedir o redimensionamento do plano de fundo ...
fonte
Caso alguém precise de um
adjustResize
comportamento e não queira que eleImageView
seja redimensionado aqui, há outra solução alternativa.Basta colocar
ImageView
dentroScrollView
=>RelativeLayout
comScrollView.fillViewport = true
.fonte
Encontrei o principal problema ao trabalhar no meu aplicativo. No começo, eu uso o método fornecido pelo @parulb para resolver o problema. Muito obrigado. Mais tarde, porém, notei que a imagem de fundo é parcialmente ocultada pela barra de ação (e pela barra de status, tenho certeza). Esse pequeno problema já foi proposto por @ zgc7009, que comentou abaixo a resposta do @parulb há um ano e meio, mas ninguém respondeu.
Trabalhei o dia inteiro para descobrir uma maneira e, felizmente, posso pelo menos resolver esse problema perfeitamente no meu celular agora.
Primeiro, precisamos de um recurso de lista de camadas na pasta drawable para adicionar preenchimento na parte superior à imagem de fundo:
Segundo, configuramos esse arquivo como recurso para segundo plano, como mencionado acima:
Estou usando o Nexus 5. Encontrei uma maneira de obter a altura da barra de ação em xml, mas não a barra de status; portanto, tenho que usar uma altura fixa de 75dp para o preenchimento superior. Espero que alguém possa encontrar a última peça deste quebra-cabeça.
fonte
Sofri problemas semelhantes, mas parece que o uso
adjustPan
comandroid:isScrollContainer="false"
ainda não corrigiu meu layout (que era um RecyclerView abaixo de um LinearLayout). O RecyclerView estava bom, mas toda vez que o teclado virtual aparecia, o LinearLayout era reajustado.Para evitar esse comportamento (eu simplesmente queria que o teclado passasse por cima do meu layout), fui com o seguinte código:
Isso diz ao Android para basicamente deixar seu layout em paz quando o teclado virtual é chamado.
Mais leitura sobre as opções possíveis pode ser encontrada aqui (embora, por incrível que pareça, não parece haver uma entrada para
adjustNothing
).fonte
Depois de estudar e implementar todas as respostas disponíveis, aqui estou adicionando uma solução.
Esta resposta é uma combinação de código de:
https://stackoverflow.com/a/45620231/1164529
https://stackoverflow.com/a/27702210/1164529
Aqui está a
AppCompatImageView
classe personalizada que não mostrou nenhum teclado virtual de alongamento ou rolagem: -Para usá-lo como plano de fundo para minha
Fragment
classe, eu o defino como primeiro elemento paraFrameLayout
.fonte
Adicione esta linha no arquivo AndroidManifest.xml :
consulte este link para mais informações.
fonte
Basta usar no seu
onCreate()
este código:e elimine esta linha no seu xml:
Leia mais em:
http://developer.android.com/reference/android/view/Window.html
obrigado por: Adrian Cid Almaguer
fonte
Eu enfrentei esse problema, quando minha imagem de plano de fundo era apenas um
ImageView
dentro deFragment
e foi redimensionada pelo teclado.Minha solução foi: usando personalizado
ImageView
a partir deste SO Resposta , editado para ser compatível comandroidx
.fonte
Basta adicionar sua atividade
fonte
Eu enfrentei esse mesmo problema antes, mas nenhuma solução funcionou para mim por tanto tempo porque eu estava usando um
Fragment
e tambémgetActivity().getWindow().setBackgroundDrawable()
não era uma solução para mim.A solução que funcionou para mim é substituir
FrameLayout
uma lógica para lidar com o teclado que deve aparecer e alterar o bitmap em movimento.Aqui está o meu código FrameLayout (Kotlin):
E eu usei como um pano de fundo habitual do FrameLayout.
frameLayout.backgroundImage = Drawable.createFromPath(path)
Espero que ajude.
fonte
Você pode agrupar seu LinearLayout com FrameLayout e adicionar ImageView com Background:
E você pode definir a altura ao criar atividade / fragmento (para impedir o dimensionamento quando o teclado estiver aberto). Algum código no Kotlin do Fragment:
fonte
se você definir a imagem como fundo da janela e a interface do usuário ficar presa. pode haver possibilidade de você usar o drawable, que está em uma única pasta drawable, se sim, será necessário colá-lo em drawable-nodpi ou drawable-xxxhdpi.
fonte
Minha solução é substituir o plano de fundo da janela pelo do layout e definir o plano de fundo como nulo. Dessa maneira, mantenho a imagem na janela de visualização XML:
Portanto, mantenha o plano de fundo no layout e adicione um ID para ele. Em seguida, na atividade onCreate (), coloque este código:
fonte