Android: Jak mogę zapobiec powiększaniu widoku przez klawiaturę ekranową?

385

Mam pionową przesuwaną szufladę na dole mojej aplikacji. Kiedy miękka klawiatura się otwiera, przesuwa zaczep szuflady do góry, tak że siedzi na górze klawiatury. Naprawdę chcę, aby pozostała na dole ekranu, ukrywając się, gdy pokazana jest klawiatura.

Ktoś jeszcze napotkał ten problem? Wiesz jak to naprawić?

Christopher Perry
źródło
1
cześć, mam ten sam problem, której flagi użyłeś w pliku manifestu, czy możesz mi pomóc z tym
Nixit Patel
1
To pytanie jest duplikowane tutaj: stackoverflow.com/questions/5516216/…
WonderWorker

Odpowiedzi:

654

Możesz po prostu zmienić windowSoftInputModeflagę aktywności na adjustPanw swoim AndroidMainfest.xmlpliku wewnątrz tagu aktywności.

Sprawdź oficjalną dokumentację, aby uzyskać więcej informacji.

<activity
   ...
   android:windowSoftInputMode="adjustPan"> 
</activity>
Alexander Oleynikov
źródło
43
Nie chcę, aby widok się przesuwał, chcę, aby pozostawał nieruchomy tam, gdzie jest, i po prostu niech klawiatura zakrywa wszystko, co zamierza ukryć.
Christopher Perry,
5
Przesuwanie oznacza, że ​​widok zostanie przewinięty, aby pokazać ten widok, do którego piszesz. Innymi słowy, jeśli pojawiająca się klawiatura nie zakryła skupionego widoku, pozostanie statyczna.
Alexander Oleynikov,
18
Mam ten sam problem. zmieniono flagę windowSoftInputMode na „adjustPan” w pliku manifeast. ale nie działa. jak to rozwiązać
Subrat
20
Nie pomaga w moim przypadku posiadanie rzędu przycisków na dole ekranu i ScrollView nad nimi. Przyciski są podnoszone bez względu na to, jaką wartość ma w windowSoftInputMode.
Artem Russakovskii
3
nie działa we fragmencie. Jak to zrobić we fragmentach?
Prashanth Debbadwar
175

Żadna z odpowiedzi nie działała dla mnie, ale udało się to:

android:windowSoftInputMode="adjustNothing"
Daniel Douglas
źródło
6
To sprawia, że ​​klawiatura wydaje się nakładać na treść, bez konieczności zmiany układu w celu ponownego obliczenia wysokości.
Reinherd
13
To rozwiązuje problem z przesuwaniem zawartości przez klawiaturę, co właśnie ja i OP chcieliśmy osiągnąć.
Daniel Douglas
8
pożyczając od @Dom, możesz użyć getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);do programowego ustawienia tej wartości
Bron Davies,
1
Ten działa dla mnie, w przeciwieństwie do innych odpowiedzi (żelki 4.1)
Virus721
Doskonały! W moim przypadku działa również. Pokazuję okno dialogowe z tekstem edycyjnym. Gdy tylko otworzy się okno dialogowe, pojawiła się również klawiatura. Próbowałem „AdjustPan”, ale zablokował funkcję wyświetlania klawiatury. Zatem „dostosuj nic” działało lepiej w moim przypadku.
sembozdemir
85

W moim przypadku powodem, dla którego przyciski zostały wypchnięte, był fakt, że widok nad nimi był a ScrollView, i zapadł się wraz z przyciskami podniesionymi nad klawiaturą, bez względu na to, jaką wartość android:windowSoftInputModeustawiłem.

Byłem w stanie ominąć mój dolny rząd przycisków podnoszony przez miękką klawiaturę, ustawiając android:isScrollContainer="false"go ScrollViewnad przyciskami.

Artem Russakovskii
źródło
2
Ale w tym przypadku miękka klawiatura zakrywa część ekranu i nie ma możliwości przewijania w dół. Wygląda na to, że istnieje tylko jeden sposób, aby dolny panel nie pojawiał się u góry klawiatury - ukrywanie go, gdy klawiatura jest otwarta ...
Dmitry
1
to jest to! Moim zdaniem ustawienie to jest bardzo interesujące, ponieważ jest to jedyny sposób, w jaki udało mi się osiągnąć efekt braku właściwości „adjustNothing”!
rupps
Używam go z Textview Working great tnx
Sunil Chaudhary
2
@Artem Russakovskii Nie wiem, kim jesteś, ale kocham cię za to rozwiązanie. Wielkie dzięki.
Lev
1
@Artem Russakovskii to działa idealnie. Wielkie dzięki.
SkypeDogg
72

Możesz spróbować dodać ten atrybut dynamicznie, umieszczając następujący kod w onCreatemetodzie swojej działalności:

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

To działało dla mnie, ale to:

android:windowSoftInputMode="adjustPan"

nie.

Dom
źródło
Czy dodałeś android:windowSoftInputMode="adjustPan"plik w AndroidManifest.xml?
Habeeb Perwad
Nie, ponieważ tak naprawdę nie miało to dla mnie znaczenia. Pierwszy wiersz kodu wykonał zadanie. :) @HabeebPerwad
Dom
Dodałem wiersz sekund w pliku AndoidManifest.xml. Myślę, że po tym tylko zadziałało. tak właśnie zapytałem.
Habeeb Perwad
1
@Dom, jak używać „ getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);” we fragmencie?
Tushar Gogna
1
Wreszcie! To działa! Miałem kontroler (rozciąga się od FragmentActivity) i niektóre widoki dołączone do niego (widoki rozciągają się od RelativeLayout). Więc w kłopotliwym widoku zrobiłem controller.getWindow()...tak, jak powiedziałeś. Działa
Alaa M.,
39

Te odpowiedzi tutaj mi nie pomogły. Więc próbowałem tego:

android:windowSoftInputMode="adjustResize"

To działało jak urok, teraz nagłówek mojej aplikacji nie znika. Jest płynniejszy.

amalBit
źródło
To prawie działa idealnie dla mnie. Jedynym problemem jest to, że pasek / rząd sugestii klawiatury nadal ukrywa mój układ. Czy napotkałeś taki problem?
Sufian,
Nie spotkałem się z tym problemem. @Sufian
amalBit
Nie spotkałem się wtedy z żadnym problemem. Teraz nie jestem pewien. @Sufian
amalBit
Dla tych, którzy mogą napotkać podobny problem, prawdopodobnie było to spowodowane TabLayout. Problem zniknął, gdy ustawiłem jego widoczność View.GONE. Może nadszedł czas na przeprojektowanie mojego układu.
Sufian,
13

Aby to zrobić programowo we fragmencie, możesz użyć następującego kodu

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

Umieść to w onResume ()

ChaturaM
źródło
11

Dla przyszłych czytelników.

Chciałem mieć konkretną kontrolę nad tym problemem, więc właśnie to zrobiłem:

Przed fragmentem lub działaniem ukryj inne widoki (które nie są potrzebne, gdy klawiatura jest podniesiona), a następnie przywróć je, aby rozwiązać ten problem:

            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
źródło
1
@ Skynet Masz absolutną rację! To było niestandardowe rozwiązanie, którego użyłem do własnego problemu.
Petro
7
Hej, to było wspaniałe. Jednak w przypadku, gdy klawiatura jest zamknięta, przez krótki czas (milisekundy) widok jest przełączany na widoczny. Zamiast ustawiać widoczność bezpośrednio, użyłem view.post(Runnable runnable)i ustawiłem widoczność stamtąd. Okazało się dla mnie świetne
daisura99
9

Tylko jedna linia do dodania ...

Dodaj android:windowSoftInputMode="stateHidden|adjustPan"wymaganą aktywność manifest file.

Właśnie rozwiązałem :) :)

Sravani
źródło
8

W przypadku użytkowników Xamarin dodaj ten kod do atrybutu Activity klasy MainActivity,

WindowSoftInputMode =Android.Views.SoftInput.AdjustNothing

lub możesz dodać ten kod Window.SetSoftInputMode(Android.Views.SoftInput.AdjustNothing)do metody OnCreate klasy MainActivity.

Patel Tushar
źródło
8

Ten działał dla mnie

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);
Suresh Pattu
źródło
7

Do tej pory odpowiedzi mi nie pomogły, ponieważ mam przycisk i pole textInput (obok siebie) pod tekstem TextView, które wciąż były ukryte przez klawiaturę, ale to rozwiązało mój problem:

android:windowSoftInputMode="adjustResize"
Michael McDowell
źródło
7

Dodaj następujący kod do „działania” pliku manifestu.

android:windowSoftInputMode="adjustResize"
Jose Kurian
źródło
To działa dobrze. Jednak tylko dla porady, nie działa dobrze, gdy używasz procentu. Ponieważ dostosowuje niektóre elementy. Tak więc, jeśli masz elementy Ograniczenia z procentem, będziesz miał problem. Zamiast tego użyj wrap_content i będzie działać bardzo dobrze.
Thiago Silva
7
android:windowSoftInputMode="stateHidden|adjustNothing"

Ten kod działa.

amyShamna
źródło
Myślę, że android: windowSoftInputMode = "stateHidden | adjustPan" powinien również działać.
Arthur Sady Cordeiro Rossetti
6

To było najlepsze, co działało dla mnie

android:windowSoftInputMode="adjustNothing"

Spróbuj!

rajlaxmi_jagdale
źródło
4

Cóż, obserwowałem te odpowiedzi, ale w moim przypadku wpadłem w ten sam problem i znalazłem schronienie dzięki bardzo przydatnemu i najłatwiejszemu rozwiązaniu, które polega na umieszczeniu bardzo małego niewinnego atrybutu w tagu Scrollview znajdującym się w pliku xml. To jest

android:isScrollContainer="false"

Powodzenia!

Ali Nawaz
źródło
4
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

Ten działa dla mnie.

Zhang Slardar
źródło
2

Widok przewijania:

jeśli po dodaniu android:windowSoftInputMode="stateHidden|adjustPan"w Manifeście Androida i nadal nie działa.

Może to mieć wpływ, ponieważ gdy pojawi się klawiatura, przejdzie do widoku przewijania, a jeśli twój przycisk / jakiekolwiek obiekty nie znajdują się w widoku przewijania, wówczas obiekty podążą za klawiaturą i przesuną swoją pozycję.

Sprawdź xml tam, gdzie jest twój przycisk i upewnij się, że znajduje się pod przewijaniem Wyświetl nawias, a nie poza nim.

Mam nadzieję, że to pomaga. :RE

Yils
źródło
2

W moim przypadku potrzebowałem klawiatury, aby pozostała ukryta, a tuż po kliknięciu przycisku mój układ musi zostać dostosowany, więc po prostu dodałem to polecenie do manifestu i było bardzo dobrze.

android:windowSoftInputMode="stateHidden|adjustResize"
Rafael Rodrigues
źródło
2

Gdy chcesz ukryć widok po otwarciu klawiatury.

Dodaj to do pliku aktywności w pliku manifestu

android:windowSoftInputMode="stateHidden|adjustPan"
Hakim Khan
źródło
2

Żadne z nich nie działało dla mnie, spróbuj tego

 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
źródło
1

Główne okno działania nie zmieni rozmiaru, aby zrobić miejsce na klawiaturę programową. Zamiast tego zawartość okna zostanie automatycznie panoramowana, aby bieżący fokus nigdy nie był zasłonięty przez klawiaturę, a użytkownicy zawsze mogli zobaczyć, co piszą.

android:windowSoftInputMode="adjustPan"

To może być lepsze rozwiązanie tego, czego pragniesz.

użytkownik3243900
źródło
1

Spróbuj użyć tego:

android:windowSoftInputMode="stateHidden|adjustPan"
Ashish Gautam
źródło
1

Ten kod może ci pomóc. Użyj go w swojej oncreatemetodzie.

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Shiv prakash Yadav
źródło
Próbowałem tego, ale mam problemy z tym, że widok odcina trochę dolną część widoku i przesuwa widok, aby nałożyć na niego czas powyżej? Wszelkie pomysły dotyczące tego, jaki układ zmienia się lub co jest potrzebne? stackoverflow.com/questions/39909897/…
Lion789,
1

Uwzględnij w pliku manifestu jako działanie, które chcesz wyświetlić. Ale upewnij się, że nie używasz działania na pełnym ekranie

android:windowSoftInputMode="adjustPan"
użytkownik3419461
źródło
1

@manifest w twojej działalności:

android:windowSoftInputMode="stateAlwaysHidden|adjustPan"
Juan Mendez
źródło
1

Rozwiązałem problem, dodając

 android:windowSoftInputMode="adjustNothing" 

W pliku manifestu dodaj.

i ustawienie ograniczenia Recyclerviews na isScrollContainer na false.

android:isScrollContainer="false"
MILION GASHAW
źródło