Przenieść układy w górę, gdy wyświetlana jest klawiatura programowa?

139

Mam kilka elementów w RelativeView z ustawionym atrybutem align bottom, gdy pojawia się klawiatura programowa, elementy są ukrywane przez klawiaturę programową.

Chciałbym, aby przesuwały się w górę, aby jeśli jest wystarczająco dużo miejsca na ekranie, były wyświetlane nad klawiaturą lub aby sekcja nad klawiaturą była przewijana, aby użytkownik nadal mógł zobaczyć elementy.

Jakieś pomysły, jak do tego podejść?

Dinedal
źródło
Zaktualizowano odniesienie z bloga programistów Androida
Jayabal,
@Dinedal Jak ustawić atrybut wyrównania dolnego na relativeView ???
KJEjava48

Odpowiedzi:

95

Możesz również użyć tego kodu w onCreate()metodzie:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Bobs
źródło
11
Dla mnie, nawet jeśli ustawię screnn AdjustPan, przejdź tylko do tekstu edycji, który kliknąłem, ale nie do całego układu
murt
33

Dodaj plik AndroidManifest.xml do swojej aktywności:

android:windowSoftInputMode="adjustPan|adjustResize"
Serhii Bohutskyi
źródło
22
Według dokumentacji zachowanie jest nieokreślone, jeśli użyjesz tutaj dwóch flag "dostosuj ...". Zobacz developer.android.com/guide/topics/manifest/…
user1806772
22

Wprowadź zmiany w aktywności pliku manifestu, na przykład

windowSoftInputMode="adjustResize"

LUB

Wprowadź zmiany w swojej onCreate()metodzie w klasie aktywności, takiej jak

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Jose Kurian
źródło
11
Dlaczego używasz różnych flag?
CoolMind
Bieżąca wersja wymaga prefiksu Androida: android: windowSoftInputMode = "adjustResize"
Andrea Leganza
21

Podobny problem, z którym miałem do czynienia w przypadku mojego układu, który zawiera widok przewijania w środku. Za każdym razem, gdy próbuję zaznaczyć tekst w EditText, pasek akcji Kopiuj / Wytnij / Wklej zostaje przesunięty w górę z poniższym kodem, ponieważ nie zmienia rozmiaru układu

android:windowSoftInputMode="adjustPan"

Zmieniając go tak, jak poniżej

1) AndroidManifest.xml

android:windowSoftInputMode="stateVisible|adjustResize"

2) plik style.xml, w stylu działania

<item name="android:windowActionBarOverlay">true</item>

Zadziałało.!!!!!!!!!!!!

Ronak Poriya
źródło
18

W AndroidManifest.xml nie zapomnij ustawić:

 android:windowSoftInputMode="adjustResize"

a dla RelativeLayout w ScrollView ustaw:

 android:layout_gravity="center" or android:layout_gravity="bottom" 

będzie dobrze

Zahra.HY
źródło
android: layout_gravity = "center" działał, dzięki! :) teraz EditText przesuwa się po klawiaturze tak, jak chciałem
Pavel Biryukov
11

dla Activity w jego metodzie oncreate wstaw poniżej wiersza

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

i fragmentów w metodzie onCreate

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Rahul_Pawar
źródło
10

Aby przewinąć ekran w górę, należy wykonać 3 kroki.

  1. Napisz w pliku manifestu dla swojej działalności:

android: windowSoftInputMode = "adjustResize"

  1. Dodaj następujący wiersz w metodzie oncreate () swojej aktywności

getWindow (). setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

  1. Następnie umieść cały widok w „Scrollview” w pliku XML, na przykład:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:background="@drawable/bg"
    android:layout_height="match_parent" 
    > 
    <RelativeLayout
         android:layout_width="fill_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center" >
        <TextView />
         .........
        <TextView />
        <EditText >
            <requestFocus />
        </EditText>
        <Button />
    </RelativeLayout>
 </ScrollView>

PS Nie zapomnij dodać android: layout_gravity = "center" w nadrzędnym układzie względnym.

Heena Arora
źródło
6

Wypróbowałem metodę Diego Ramíreza, to działa. W AndroidManifest:

    <activity
        android:name=".MainActivity"
        android:windowSoftInputMode="stateHidden|adjustResize">
        ...
    </activity>

W activity_main.xml:

<LinearLayout ...
    android:orientation="vertical">

<Space
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:layout_weight="1" />

<EditText
    android:id="@+id/edName"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ems="10"
    android:hint="@string/first_name"
    android:inputType="textPersonName" />

<EditText ...>
...
</LinearLayout>
CoolMind
źródło
6
<activity name="ActivityName"
    android:windowSoftInputMode="adjustResize">
    ...
</activity>

Dodaj NestedScrollView wokół układu, który chcesz przewijać, to będzie idealnie działać

Prakash Reddy
źródło
3

Znalazłem rozwiązanie moich problemów, które jest prawie takie samo jak twoje.

Przede wszystkim mam tylko LinearLayout z 2 elementami, ImageView i LinearLayout, który zawiera 2 EditText i jeden Button, więc musiałem je rozdzielić na pełnym ekranie bez klawiatury, a kiedy pojawi się klawiatura, powinny wyglądać bliżej.

Dodałem więc widok między nimi z atrybutem wysokości w 0dp i wadze 1, dzięki czemu moje widoki są oddzielone od siebie. a kiedy klawiatura się pojawia, ponieważ nie ma stałej wysokości, po prostu zmienia rozmiar i zachowuje proporcje.

Voila! Zmiana rozmiaru układu i odległość między widokami są takie same, gdy klawiatura jest obecna lub nie.

Diego Ramírez Vásquez
źródło
6
Dlaczego nie wyślesz kodu, aby lepiej go zrozumieć?
johnkarka
Opublikowałem powyżej przykładowy kod: stackoverflow.com/a/31994697/2914140 .
CoolMind
można to osiągnąć w mniej skomplikowany sposób, używając ConstraintLayoutlitery i przypinając górną sekcję do góry i dolną do dołu. Gdy klawiatura się otworzy, naturalnie zmieni rozmiar, ściskając spację pośrodku (jeśli używasz adjustResize)
hmac
2
If user want this task using manifest then add this line in manifest
In manifest add this line: - android:windowSoftInputMode="adjustPan"
    e.g.
     <activity
           android:name=".ui.home.HomeActivity"
           android:screenOrientation="portrait"
           android:windowSoftInputMode="adjustPan">
     </activity>


    In Java File or Kotlin File(Programically) : - If user want this using Activity then add below line in onCreate Method

    activity!!.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
safal bhatia
źródło
Cześć i witaj w stackoverflow i dziękuję za odpowiedź. Zamiast publikować tylko blok kodu, czy możesz podać krótkie wyjaśnienie, na czym problem został rozwiązany i jak go rozwiązałeś? Pomoże to ludziom, którzy napotkają to pytanie w przyszłości, lepiej zrozumieć problem i jak sobie z nim poradzić.
Plutian
1

Oto pełny kod manifestu

<activity
        android:name=".activities.MainActivity"
        android:windowSoftInputMode="adjustResize"
        android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
Dantalian
źródło
1

jeśli jesteś w fragmentach to musisz dodać poniższy kod do swojego onCreate na swojej aktywności rozwiązuje problem dla mnie

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Pratik Mohanrao Gondil
źródło
1

W pliku manifestu dodaj poniższą linię. To będzie działać

<activity name="MainActivity"
    android:windowSoftInputMode="stateVisible|adjustResize">
    ...
</activity>
Shivam Garg
źródło
1

Właśnie dodałem następujący wiersz do układu najwyższego poziomu i wszystko działało:

android:fitsSystemWindows="true"
Darush
źródło
@ yash786 jest prawdopodobnie przycisk Pokaż poniżej edittext, który ma fokus? Drugie pytanie, czy możesz udostępnić plik układu lub odpowiedzieć mi, jak dodać edittext do górnej części klawiatury?
Heroes84
to działa dla mnie zdarzenie bez Androida: windowSoftInputMode = "stateVisible | adjustResize"
powiększenie
0

W porządku, jest bardzo późno, ale odkryłem, że jeśli dodasz widok listy pod tekstem edycji, klawiatura przeniesie wszystkie układy pod tym edittext bez przenoszenia widoku ListView

<EditText
android:id="@+id/et"
android:layout_height="match_parent"
android:layout_width="match_parent"



/>

<ListView
    android:layout_width="match_parent"
    android:layout_height="match_parent"//can make as 1dp
    android:layout_below="@+id/et" // set to below editext
    android:id="@+id/view"
    >
**<any layout**

To jedyne rozwiązanie, które u mnie zadziałało.

Omar Boshra
źródło
0

Żadna rada nie rozwiązuje mojego problemu. Regulacja panoramy jest prawie tak samo jak praca Dopasuj zmianę rozmiaru . Jeśli ustawię opcję Dostosuj, tylko układ nie przesunie się w górę, ale ukryje mój tekst na dole, który obecnie piszę. Po 24 godzinach ciągłych poszukiwań znalazłem to źródło i rozwiązało mój problem.

Mahbubur Rahman Khan
źródło
0

Może być późno, ale chcę dodać kilka rzeczy. W Android Studio w wersji 4.0.1 i Gradle w wersji 6.1.1 windowSoftInputMode nie będzie działać zgodnie z oczekiwaniami, jeśli dodasz następujące flagi w swoim działaniu:

getWindow().setFlags(
                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
        );

Po zmarnowaniu dużo czasu znalazłem ten hack. Aby adjustResizelub AdjustPanlub atrybut windowSoftInputModedo pracy prawidłowo, trzeba usunąć to od Twojej aktywności.

Shehryar Aɱɩŋ
źródło