Android: como impedir que o teclado virtual levante minha visualização?


386

Eu tenho uma gaveta deslizante vertical na parte inferior do meu aplicativo. Quando o teclado virtual é aberto, ele empurra a aba da gaveta para cima e fica em cima do teclado. Na verdade, eu quero que ele permaneça na parte inferior da tela, ficando oculto quando o teclado é mostrado.

Mais alguém encontrou esse problema? Sabe como consertar?


11
oi, eu estou tendo mesmo problema que bandeira você usou no arquivo de manifesto, você pode plz me ajudar com isso
Nixit Patel

11
Esta questão é duplicada aqui: stackoverflow.com/questions/5516216/…
WonderWorker

Respostas:


656

Você pode simplesmente mudar o windowSoftInputModesinalizador da sua atividade para o adjustPanseu AndroidMainfest.xmlarquivo dentro da sua tag de atividade.

Consulte a documentação oficial para mais informações.

<activity
   ...
   android:windowSoftInputMode="adjustPan"> 
</activity>

43
Não quero que a vista se desloque, quero que ela permaneça estática onde está e apenas coloque o teclado para cobrir o que for necessário.
Christopher Perry

5
Ao fazer o pan, significa que a visualização será rolada para tornar visível a visualização na qual você está digitando. Em outras palavras, se o teclado aparecer, não encobrir a visão focada, permanecerá estático.
Alexander Oleynikov

18
Estou enfrentando o mesmo problema. fez o sinalizador windowSoftInputMode para "AdjustPan" no arquivo de manifesto.mas não está funcionando. como resolvê-lo
Subrat

20
Não ajuda no meu caso de ter uma linha de botões na parte inferior da tela e um ScrollView acima deles. Os botões são pressionados, independentemente do valor em windowSoftInputMode.
Artem Russakovskii 17/10/11

3
não está trabalhando em um fragmento. Como fazer isso em fragmentos?
Prashanth Debbadwar

175

Nenhuma das respostas funcionou para mim, mas isso funcionou:

android:windowSoftInputMode="adjustNothing"

6
Isso faz com que o teclado apareça sobreposto ao conteúdo, sem fazer o layout para recalcular sua altura.
precisa saber é o seguinte

13
Isso resolve o problema do teclado, que é o que eu e o OP queríamos alcançar.
Daniel Douglas

8
empréstimo de @Dom você pode usar getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);para definir este valor programaticamente
Bron Davies

11
Este funciona para mim, ao contrário de outras respostas (jelly bean 4.1)
Virus721

Perfeito! Também está funcionando no meu caso. Estou mostrando uma caixa de diálogo com um edittext dentro. Assim que a caixa de diálogo é aberta, o teclado também estava aparecendo. Eu tentei "AdjustPan", mas bloqueou o recurso de exibição do teclado. Então, "AdjustNothing" funcionou melhor no meu caso.
Sembozdemir

85

No meu caso, a razão pela qual os botões foram pressionados foi porque a vista acima deles era a ScrollView, e ela caiu com os botões pressionados acima do teclado, independentemente do valor que android:windowSoftInputModeeu estava configurando.

Consegui evitar que minha linha inferior de botões fosse pressionada pelo teclado virtual, definindo android:isScrollContainer="false"a ScrollViewque fica acima dos botões.


2
Mas, neste caso, o teclado virtual cobre parte da tela e não há como rolar para baixo. Parece que há apenas uma maneira de evitar que o painel inferior para aparecer na parte superior do teclado - escondendo-o quando o teclado está aberto ...
Dmitry

11
é isso! Na minha opinião, essa configuração é muito interessante de comentar, pois é a única maneira que encontrei para obter os efeitos da propriedade ausente "AdjustNothing"!
rompe 03/03

Eu usá-lo com Textview Trabalho grande tnx
Sunil Chaudhary

2
@Artem Russakovskii Não sei quem você é, mas eu amo você por esta solução. Muito obrigado.
Lev

11
@Artem Russakovskii isso funciona perfeitamente. Muito obrigado.
SkypeDogg 18/01/19

72

Você pode tentar adicionar esse atributo dinamicamente, colocando o seguinte código no onCreatemétodo da sua atividade:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

Isso funcionou para mim, mas que:

android:windowSoftInputMode="adjustPan"

não.


Você adicionou o android:windowSoftInputMode="adjustPan"no AndroidManifest.xml?
Habeeb Perwad

Não, porque realmente não fez nenhuma diferença para mim. A primeira linha de código fez o trabalho. :) @HabeebPerwad
Dom

Eu adicionei a linha de segundos no arquivo AndoidManifest.xml. Acho que depois disso só funcionou. então apenas perguntei.
Habeeb Perwad

11
@ Dom, como usar " getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);" em um fragmento?
Tushar Gogna

11
Finalmente! Isso funciona! Eu tinha um controlador (se estende de FragmentActivity) e algumas visualizações anexadas (as visualizações se estendem de RelativeLayout). Então, na visão problemática, eu fiz controller.getWindow()...como você disse. Funciona
Alaa M.

39

Essas respostas aqui não me ajudaram. Então eu tentei isso:

android:windowSoftInputMode="adjustResize"

Isso funcionou como um encanto, agora o cabeçalho do meu aplicativo não desaparece. É mais suave.


Isso quase funciona perfeitamente para mim. O único problema é que a barra / linha de sugestões do teclado ainda oculta meu layout. Você enfrentou esse problema?
Sufian

Eu não enfrentei esse problema. @Sufian
amalBit

Eu não havia enfrentado nenhum problema naquela época. Agora não tenho certeza. @Sufian
amalBit

Para aqueles que podem enfrentar problemas semelhantes, provavelmente foi devido a TabLayout. O problema desapareceu assim que defini sua visibilidade View.GONE. Talvez seja hora de redesenhar meu layout.
Sufian

13

Para fazer isso programaticamente em um fragmento, você pode usar o seguinte código

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

Coloque isso em onResume ()


11

Para futuros leitores.

Eu queria um controle específico sobre esse problema, então foi isso que fiz:

De um fragmento ou atividade, oculte suas outras visualizações (que não são necessárias enquanto o teclado estiver ativado) e restaure-as para resolver este problema:

            rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    Rect r = new Rect();
                    rootView.getWindowVisibleDisplayFrame(r);
                    int heightDiff = rootView.getRootView().getHeight() - (r.bottom - r.top);

                    if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard...
                    //ok now we know the keyboard is up...
                        view_one.setVisibility(View.GONE);
                        view_two.setVisibility(View.GONE);

                    }else{
                    //ok now we know the keyboard is down...
                        view_one.setVisibility(View.VISIBLE);
                        view_two.setVisibility(View.VISIBLE);

                    }
                }
            });

11
@ Skynet Você está absolutamente certo! Essa foi uma solução personalizada que eu usei para o meu próprio problema.
Petro

7
Ei, isso foi brilhante. No entanto, na instância em que o teclado está fechado, há um curto período (milissegundos) em que a visualização é alterada para visível. Então, em vez de definir a visibilidade diretamente, usei view.post(Runnable runnable)e defini a visibilidade a partir daí. O resultado foi ótimo para mim
daisura99

9

Apenas uma única linha a ser adicionada ...

Adicione a android:windowSoftInputMode="stateHidden|adjustPan"atividade necessária do seu manifest file.

Acabei de ser resolvido :) :)


8

Para usuários do xamarin, adicione esse código ao atributo Activity da classe MainActivity,

WindowSoftInputMode =Android.Views.SoftInput.AdjustNothing

ou você pode adicionar esse código Window.SetSoftInputMode(Android.Views.SoftInput.AdjustNothing)ao método OnCreate da classe MainActivity.


8

Este funcionou para mim

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);

7

Até agora, as respostas não me ajudaram, pois tenho um botão e um campo textInput (lado a lado) abaixo do textView, que ficava oculto pelo teclado, mas isso resolveu o meu problema:

android:windowSoftInputMode="adjustResize"

7

Adicione o seguinte código à 'atividade' do arquivo Manifest.

android:windowSoftInputMode="adjustResize"

Isso funciona bem. No entanto, apenas para aconselhar, não funciona bem quando você usa porcentagem. Porque reajustar alguns elementos. Portanto, se você tiver elementos de Restrições com porcentagem, terá um problema. Use wrap_content e ele funcionará muito bem.
Thiago Silva


6

Este foi o melhor que funcionou para mim

android:windowSoftInputMode="adjustNothing"

Tente!


4

Bem, eu assisti essas respostas, mas no meu caso, caí no mesmo problema e me refugiei em uma solução muito prática e fácil que envolve colocar um atributo inocente muito pequeno na sua tag Scrollview que reside no seu arquivo xml. Isso é

android:isScrollContainer="false"

Boa sorte!


4
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

Este está trabalhando para mim.


2

Para exibição de rolagem:

se depois de adicionar o android:windowSoftInputMode="stateHidden|adjustPan"seu manifesto do Android e ainda não funcionar.

Isso pode ser afetado porque, quando o teclado aparecer, ele estará em uma visualização de rolagem e, se o botão / qualquer objeto não estiver na visualização de rolagem, os objetos seguirão o teclado e moverão sua posição.

Verifique seu xml onde está o botão e verifique se ele está sob o suporte de rolagem Exibir e não está fora dele.

Espero que isso ajude. : D


2

No meu caso, eu precisava que o teclado permanecesse oculto e, logo após o clique do botão, meu layout precisava ser ajustado, então adicionei esse comando no manifesto e ficou super correto.

android:windowSoftInputMode="stateHidden|adjustResize"

2

Quando você deseja ocultar a exibição quando abre o teclado.

Adicione isso à sua atividade no arquivo de manifesto

android:windowSoftInputMode="stateHidden|adjustPan"

2

Nenhum deles funcionou para mim, tente este

 private void scrollingWhileKeyboard() {
    drawerlayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {

            Rect r = new Rect();
            try {
                drawerlayout.getWindowVisibleDisplayFrame(r);
                int screenHeight = drawerlayout.getRootView().getHeight();
                int keypadHeight = screenHeight - r.bottom;
                if (keypadHeight > screenHeight * 0.15) {
                    tabLayout.setVisibility(View.GONE);
                } else {
                    tabLayout.setVisibility(View.VISIBLE);
                }
            } catch (NullPointerException e) {

            }
        }
    });

}

1

A janela principal da atividade não será redimensionada para liberar espaço para o teclado virtual. Em vez disso, o conteúdo da janela será automaticamente deslocado para que o foco atual nunca seja obscurecido pelo teclado e os usuários sempre possam ver o que estão digitando.

android:windowSoftInputMode="adjustPan"

Essa pode ser a melhor solução para o que você deseja.



1

Este código pode ajudá-lo. Use-o no seu oncreatemétodo.

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

Eu tentei isso, mas estou tendo problemas em que a exibição corta um pouco da parte inferior da exibição e empurra a exibição para sobrepor o tempo acima? Alguma idéia sobre o layout alterado ou o que é necessário? stackoverflow.com/questions/39909897/…
Lion789

1

Inclua no arquivo de manifesto a atividade que você deseja exibir. Mas certifique-se de não usar a tela cheia Activity

android:windowSoftInputMode="adjustPan"

1

@ manifesto em sua atividade:

android:windowSoftInputMode="stateAlwaysHidden|adjustPan"

1

Resolvi meu problema adicionando

 android:windowSoftInputMode="adjustNothing" 

No arquivo de manifesto, adicione.

e tornar a restrição Recyclerviews isScrollContainer como false.

android:isScrollContainer="false"
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.