Chciałbym dostosować / zmienić rozmiar układu, gdy aktywowana jest klawiatura programowa, jak poniżej:
Przed i po:
Znaleziono kilka zasobów w SO:
- Jak zachować wszystkie pola i teksty widoczne, gdy wyświetlana jest klawiatura ekranowa
- miękka klawiatura android psuje układ, gdy się pojawi
- Dostosuj układ, gdy włączona jest klawiatura programowa
Ale pytania i odpowiedzi są raczej niejednoznaczne, oto pytanie z jaśniejszym obrazem tego, czego chcę.
Wymagania:
- Powinien działać na telefonie o dowolnych rozmiarach ekranu.
- Zauważyłem, że marginesy / odstępy na „FACEBOOKU” i „Zarejestruj się na Facebooku” zmieniły się przed i po.
- Nie jest używany widok przewijania.
Theme.AppCompat.Light.NoActionBar.FullScreen
), zgodnie z tą odpowiedzią -> stackoverflow.com/a/7509285/1307690Odpowiedzi:
Poprostu dodaj
w pliku AndroidManifest.xml, w którym deklarujesz tę konkretną aktywność, a to dostosuje opcję zmiany rozmiaru układu.
poniżej trochę kodu źródłowego do projektowania układu
źródło
To pytanie zostało zadane kilka lat temu i „Secret Andro Geni” ma dobre podstawowe wyjaśnienie, a „tir38” również podjął dobrą próbę znalezienia kompletnego rozwiązania, ale niestety nie ma tutaj pełnego rozwiązania. Spędziłem kilka godzin na zastanawianiu się, a oto moje kompletne rozwiązanie ze szczegółowym wyjaśnieniem na dole:
A w AndroidManifest.xml nie zapomnij ustawić:
na
<activity>
tagu, że chcesz taki układ.Myśli:
Zdałem sobie sprawę, że
RelativeLayout
są to układy, które obejmują całą dostępną przestrzeń, a następnie są zmieniane, gdy pojawia się klawiatura.I
LinearLayout
są układami, których rozmiar nie jest zmieniany w procesie zmiany rozmiaru.Dlatego musisz mieć 1
RelativeLayout
natychmiast po,ScrollView
aby objąć całe dostępne miejsce na ekranie. I musisz miećLinearLayout
wnętrze, w którymRelativeLayout
inne wnętrze zostanie zmiażdżone, gdy nastąpi zmiana rozmiaru. Dobrym przykładem jest „headerLayout”. Gdyby nie byłoLinearLayout
wnętrza,RelativeLayout
tekst z Facebooka zostałby zmiażdżony i nie zostałby wyświetlony.Na zdjęciach logowania "facebook" zamieszczonych w pytaniu zauważyłem również, że cała część logowania (mainLayout) jest wyśrodkowana pionowo w stosunku do całego ekranu, stąd atrybut:
na
LinearLayout
układzie. A ponieważ mainLayout znajduje się wewnątrz a,LinearLayout
oznacza to, że rozmiar tej części nie zostanie zmieniony (ponownie zobacz odpowiedni rysunek).źródło
android:layout_alignParentBottom="true"
. To sprawia, że przykleja się do dna.android:layout_marginBottom="15dp"
do footerLayout a następnie RelativeLayout że trzyma textView2 i helpbutton . W obu przypadkach helpButton zostaje zmiażdżony (nawet bez atrybutu marginBottom). W żaden sposób editText1 lub editText2 nigdy nie zostanie zgnieciony, ponieważ znajdują się wewnątrz LinearLayout . Czy może ustawiłeś margines na jakimkolwiek innym układzie )? Spróbuj od zera, jeśli nic nie osiągniesz! Możesz także bawić się atrybutem w AndroidManifest. (nie tylko footerLayoutandroid:windowSoftInputMode
Dodaj tę linię do swojego Manifestu, gdzie nazywa się Twoja Aktywność
lub
możesz dodać tę linię do swojego
onCreate
źródło
adjustPan
iadjustResize
. To są różne tryby. Przeczytaj więcej o nich tutaj: stackoverflow.com/a/17410528/1738090 A tutaj: developer.android.com/guide/topics/manifest/activity-elementAndroid Developer ma właściwą odpowiedź, ale dostarczony kod źródłowy jest dość rozwlekły i faktycznie nie implementuje wzorca opisanego na diagramie.
Oto lepszy szablon:
Do Ciebie należy decyzja, jakich widoków użyjesz do części „przewijanej” i „stopki”. Wiedz również, że prawdopodobnie musisz ustawić
ScrollView
s fillViewPort .źródło
LinearLayout
zamiast Ramka i Względna, ale wszystkie widoki wciąż się pokrywają.Może działać dla każdego rodzaju układu.
na przykład:
i
na przykład:
źródło
Dzięki temu możliwe jest wyświetlenie dowolnego układu, który był wcześniej ukryty przez klawiaturę.
Dodaj to do tagu aktywności w AndroidManifest.xml
Otocz swój główny widok ScrollView, najlepiej scrollbars = none. ScrollView właściwie nie zmieni niczego w twoim układzie, z wyjątkiem użycia do rozwiązania tego problemu.
Następnie ustaw fitSystemWindows = "true" w widoku, który chcesz wyświetlić w całości nad klawiaturą. Spowoduje to, że Twój EditText będzie widoczny nad klawiaturą i umożliwi przewijanie w dół do części poniżej EditText, ale w widoku z fitSystemWindows = "true".
Na przykład:
Jeśli chcesz wyświetlić pełną część widoku fitSystemWindows = "true" nad klawiaturą w momencie pojawienia się klawiatury, będziesz potrzebować kodu, aby przewinąć widok w dół:
Przykład pełnego układu:
źródło
android:fitsSystemWindows="true"
jest tym, co dało mi pożądane rezultaty, których chciałem ... dziękiDla tych, którzy używają ConstraintLayout ,
android:windowSoftInputMode="adjustPan|adjustResize"
nie będzie działać.To, co możesz zrobić, to użyć miękkiego słuchacza klawiatury , ustawić ograniczenia widoków od dołu do dołu górnych widoków, a następnie ustawić odchylenie pionowe dla każdego widoku (jako procent pozycji między ograniczeniami) na prowadnicę poziomą (również pozycjonowaną procentowo , ale do rodzica).
Dla każdego widoku, po prostu trzeba zmienić
app:layout_constraintBottom_toBottomOf
się@+id/guideline
, gdy klawiatura jest pokazany , programowo oczywiście.Zwykle miękka klawiatura zajmuje nie więcej niż 50% wysokości ekranu. W ten sposób można ustawić wytyczne na 0,5.
Teraz programowo, gdy klawiatura nie jest wyświetlana , możemy ustawić wszystkie z
app:layout_constraintBottom_toBottomOf
powrotem na rodzica i odwrotnie.Wywołaj tę metodę:
Ważne jest, aby upewnić się, że odchylenie pionowe zostało ustawione w sposób, który będzie skalowany prawidłowo, gdy klawiatura jest pokazana, a nie pokazana.
źródło
Wiele odpowiedzi jest poprawnych. W
AndroidManifest
napisałem:W moim przypadku dodałem motyw w
styles.xml
, ale możesz użyć własnego:Zauważyłem, że jeśli używam motywu pełnoekranowego, zmiana rozmiaru nie występuje:
Również w moim przypadku
adjustResize
działa, aleadjustPan
nie.W przypadku układów pełnoekranowych zobacz obejście w systemie Android Jak dostosować układ w trybie pełnoekranowym, gdy widoczna jest klawiatura programowa lub na https://gist.github.com/grennis/2e3cd5f7a9238c59861015ce0a7c5584 .
Również https://medium.com/@sandeeptengale/problem-solved-3-android-full-screen-view-translucent-scrollview-adjustresize-keyboard-b0547c7ced32 działa, ale to StatusBar jest przezroczysty, więc bateria, zegar, Wi- Ikony Fi są widoczne.
Jeśli utworzysz działanie za pomocą polecenia Plik> Nowy> Działanie> Działanie na pełnym ekranie, gdzie w kodzie jest używany:
nie osiągniesz też rezultatu. Możesz użyć
android:fitsSystemWindows="true"
w kontenerze głównym, ale pojawi się StatusBar. Więc użyj obejść z pierwszego linku.źródło
W moim przypadku pomogło.
main_layout.xml
Użyj tego w
manifest
plikuTeraz najważniejsza część! Użyj takiego motywu w tagu albo
Activity
lubApplication
.A motyw wygląda tak
Więc brakowało mi tematu. Przez cały dzień byłem sfrustrowany.
źródło
Możesz po prostu ustawić te opcje w pliku AndroidManifest.xml.
Sposób użycia
adjustPan
nie jest zalecane przez Google, ponieważ użytkownik może potrzebować zamknąć klawiaturę, aby zobaczyć wszystkie pola wprowadzania.Więcej informacji: Manifest aplikacji na Androida
źródło
U mnie zadziałało z tą linią kodu:
Po prostu umieść to w metodzie onCreate. Najlepsza!
źródło
Dodaj tę linię do Manifiest File:
źródło
Używam tej rozszerzonej ramki klasy A kiedy muszę ponownie obliczyć rozmiar wysokości onLayout, nadpisuję onmeasure i odejmuję keyboardHeight za pomocą getKeyboardHeight ()
Stworzyłem ramkę, która potrzebuje zmiany rozmiaru za pomocą klawiatury programowej
SizeNotifierFrameLayout
źródło
Ten kod działa dla mnie. Gdy pojawi się klawiatura, możesz przewijać ekran
W AndroidManifest.xml
activity_sign_up.xml
rounded_border_edittext.xml
btn_blue_selector.xml
źródło
W Xamarin zarejestruj poniższy kod w swojej działalności
Użyłem układu względnego, jeśli używasz układu ograniczenia, powyższy kod będzie działał z kodem poniżej
źródło