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ć?


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>

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"

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.


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.


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.


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


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

                    }
                }
            });

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 :) :)


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.


8

Ten działał dla mnie

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

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"

7

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

android:windowSoftInputMode="adjustResize"

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



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!


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

Ten działa dla mnie.


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


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"

2

Gdy chcesz ukryć widok po otwarciu klawiatury.

Dodaj to do pliku aktywności w pliku manifestu

android:windowSoftInputMode="stateHidden|adjustPan"

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) {

            }
        }
    });

}

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.



1

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

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

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"

1

@manifest w twojej działalności:

android:windowSoftInputMode="stateAlwaysHidden|adjustPan"

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"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.