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?

Christopher Perry
fonte
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>
Alexander Oleynikov
fonte
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"
Daniel Douglas
fonte
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.

Artem Russakovskii
fonte
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.

Dom
fonte
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.

amalBit
fonte
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 ()

ChaturaM
fonte
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);

                    }
                }
            });
Petro
fonte
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 :) :)

Sravani
fonte
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.

Tushar patel
fonte
8

Este funcionou para mim

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);
Suresh Pattu
fonte
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"
Michael McDowell
fonte
7

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

android:windowSoftInputMode="adjustResize"
Jose Kurian
fonte
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
7
android:windowSoftInputMode="stateHidden|adjustNothing"

Este código funciona.

amyShamna
fonte
Acho android: windowSoftInputMode = "stateHidden | AdjustPan" também deve funcionar.
Arthur Sady Cordeiro Rossetti
6

Este foi o melhor que funcionou para mim

android:windowSoftInputMode="adjustNothing"

Tente!

rajlaxmi_jagdale
fonte
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!

Ali Nawaz
fonte
4
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

Este está trabalhando para mim.

Zhang Slardar
fonte
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

Yils
fonte
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"
Rafael Rodrigues
fonte
2

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

Adicione isso à sua atividade no arquivo de manifesto

android:windowSoftInputMode="stateHidden|adjustPan"
Hakim Khan
fonte
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) {

            }
        }
    });

}
Saljith Kj
fonte
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.

user3243900
fonte
1

Tente usar isto:

android:windowSoftInputMode="stateHidden|adjustPan"
Ashish Gautam
fonte
1

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

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Shiv prakash Yadav
fonte
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"
user3419461
fonte
1

@ manifesto em sua atividade:

android:windowSoftInputMode="stateAlwaysHidden|adjustPan"
Juan Mendez
fonte
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"
MILHÕES DE GASHAW
fonte