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


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

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


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

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.!!!!!!!!!!!!


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


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

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.


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>

6
<activity name="ActivityName"
    android:windowSoftInputMode="adjustResize">
    ...
</activity>

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


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.


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

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>

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

1

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

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

1

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

android:fitsSystemWindows="true"

@ 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.


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.


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.

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.