Layouts nach oben verschieben, wenn eine weiche Tastatur angezeigt wird?


139

Ich habe einige Elemente in einer RelativeView mit dem Attribut "Unten ausrichten" festgelegt. Wenn die Softtastatur angezeigt wird, werden die Elemente von der Softtastatur ausgeblendet.

Ich möchte, dass sie nach oben verschoben werden, damit sie über der Tastatur angezeigt werden, wenn genügend Platz auf dem Bildschirm vorhanden ist, oder dass der Abschnitt über der Tastatur scrollbar ist, damit der Benutzer die Elemente weiterhin sehen kann.

Irgendwelche Ideen, wie man das angeht?


Aktualisierte Referenz von Android-Entwickler-Blog
Jayabal

@Dinedal Wie setzen Sie das Attribut "Ausrichten unten" auf "RelativeView"?
KJEjava48

Antworten:



95

Sie können diesen Code auch in folgenden onCreate()Methoden verwenden:

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

11
Für mich selbst wenn ich adjustPan screnn setze, bewege dich nur bis zu dem Bearbeitungstext, auf den ich geklickt habe, aber nicht auf das gesamte Layout
murt


22

Nehmen Sie Änderungen an der Aktivität Ihrer Manifest-Datei vor

windowSoftInputMode="adjustResize"

ODER

Nehmen Sie Änderungen an Ihrer onCreate()Methode in der Aktivitätsklasse vor

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

11
Warum benutzt du verschiedene Flags?
CoolMind

Aktuelle Version erfordert Android-Präfix: android: windowSoftInputMode = "adjustResize"
Andrea Leganza

21

Ein ähnliches Problem hatte ich mit meinem Layout, das aus einer Bildlaufansicht besteht. Immer wenn ich versuche, Text in EditText auszuwählen, wird die Aktionsleiste Kopieren / Ausschneiden / Einfügen mit dem folgenden Code nach oben verschoben, sodass die Größe des Layouts nicht geändert wird

android:windowSoftInputMode="adjustPan"

Indem Sie es wie folgt ändern

1) AndroidManifest.xml

android:windowSoftInputMode="stateVisible|adjustResize"

2) Datei style.xml im Aktivitätsstil

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

Es funktionierte.!!!!!!!!!!!!


18

Vergessen Sie in AndroidManifest.xml nicht Folgendes festzulegen:

 android:windowSoftInputMode="adjustResize"

und für RelativeLayout in ScrollView setzen Sie:

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

es wird in Ordnung sein


android: layout_gravity = "center" hat funktioniert, danke! :) jetzt bewegt sich EditText über die Tastatur, wie ich wollte
Pavel Biryukov

11

Fügen Sie für Aktivität in seiner Oncreate-Methode die folgende Zeile ein

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

und für Fragmente in seiner onCreate-Methode

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

10

Es sind 3 Schritte zu befolgen, um den Bildschirm nach oben zu scrollen.

  1. Schreiben Sie in eine Manifestdatei für Ihre Aktivität:

android: windowSoftInputMode = "adjustResize"

  1. Fügen Sie die folgende Zeile in die oncreate () -Methode Ihrer Aktivität ein

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

  1. Platzieren Sie dann Ihre gesamte Ansicht in "Scrollview" in einer XML-Datei wie folgt:
<?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 Vergessen Sie nicht, Android hinzuzufügen: layout_gravity = "center" im übergeordneten relativen Layout.


6

Ich habe eine Methode von Diego Ramírez ausprobiert, sie funktioniert. In AndroidManifest:

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

In 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>

Fügen Sie NestedScrollView um das Layout hinzu, das Sie scrollen möchten. Dies funktioniert einwandfrei


3

Ich habe eine Lösung für meine Probleme gefunden, die ziemlich genau so ist wie deine.

Zunächst habe ich nur ein LinearLayout mit 2 Elementen, eine ImageView und ein LinearLayout, das 2 EditText und eine Schaltfläche enthält. Daher musste ich sie im Vollbildmodus ohne Tastatur getrennt halten, und wenn die Tastatur angezeigt wird, sollten sie genauer hinsehen.

Also habe ich die Ansicht zwischen ihnen mit dem Attribut height in 0dp und weight 1 hinzugefügt, sodass ich meine Ansichten voneinander trennen kann. und wenn die Tastatur-Apper keine feste Höhe haben, ändern sie einfach die Größe und behalten den Aspekt bei.

Voila! Die Größe des Layouts und der Abstand zwischen meinen Ansichten sind gleich, wenn die Tastatur vorhanden ist oder nicht.


6
Warum postest du den Code nicht zum besseren Verständnis?
Johnkarka

Ich habe oben einen Beispielcode gepostet: stackoverflow.com/a/31994697/2914140 .
CoolMind

Sie können dies auf eine weniger hackige Art ConstraintLayoutund Weise erreichen, indem Sie a verwenden und einen oberen Abschnitt nach oben und einen unteren Abschnitt nach unten stecken . Wenn sich die Tastatur öffnet, wird die Größe natürlich geändert, indem der Platz in der Mitte adjustResize
gedrückt wird

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

Hallo und willkommen bei stackoverflow, und vielen Dank für Ihre Antwort. Können Sie, anstatt nur einen Codeblock zu veröffentlichen, kurz erklären, welches Problem Sie gelöst haben und wie Sie es gelöst haben? Dies wird Menschen, die diese Frage in Zukunft finden, helfen, das Problem besser zu verstehen und damit umzugehen.
Plutian

1

Hier ist der vollständige Manifestcode

<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

Wenn Sie in Fragmenten sind, müssen Sie den folgenden Code zu Ihrem onCreate für Ihre Aktivität hinzufügen, um das Problem für mich zu lösen

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

1

Fügen Sie in Ihrer Manifestdatei die folgende Zeile hinzu. Es wird klappen

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

1

Ich habe gerade die folgende Zeile zum Layout der obersten Ebene hinzugefügt und alles hat funktioniert:

android:fitsSystemWindows="true"

@ yash786 ist möglicherweise die Schaltfläche unter edittext anzeigen, die einen Fokus erhalten? Zweite Frage: Können Sie Ihre Layoutdatei freigeben oder mir antworten, wie Sie edittext oben auf dem Keybord hinzufügen?
Heroes84

es funktioniert für mich Ereignis ohne Android: windowSoftInputMode = "stateVisible | adjustResize"
Zoom

0

Okay, das ist sehr spät, aber ich habe festgestellt, dass die Tastatur alle Layouts unter diesem Edittext verschiebt, ohne die ListView zu verschieben, wenn Sie eine Listenansicht unter Ihrem Bearbeitungstext hinzufügen

<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**

Dies ist die einzige Lösung, die für mich funktioniert hat.


0

Kein einziger Rat löst mein Problem. Adjust Pan ist fast so wie Arbeit Adjust Resize . Wenn ich Adjust Nothing als Layout einstelle, bewege ich mich nicht nach oben, sondern verstecke meinen Edittext von unten, den ich gerade schreibe. Nach 24 Stunden ununterbrochener Suche fand ich diese Quelle und sie löste mein Problem.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.