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?

Dinedal
quelle
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);
Bobs
quelle
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
33

Fügen Sie in AndroidManifest.xml für Ihre Aktivität hinzu:

android:windowSoftInputMode="adjustPan|adjustResize"
Serhii Bohutskyi
quelle
22
Laut Dokumentation ist das Verhalten nicht spezifiziert, wenn Sie hier zwei "adjust ..." - Flags verwenden. Siehe developer.android.com/guide/topics/manifest/…
user1806772
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);
Jose Kurian
quelle
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.!!!!!!!!!!!!

Ronak Poriya
quelle
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

Zahra.HY
quelle
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);
Rahul_Pawar
quelle
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.

Heena Arora
quelle
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>
CoolMind
quelle
6
<activity name="ActivityName"
    android:windowSoftInputMode="adjustResize">
    ...
</activity>

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

Prakash Reddy
quelle
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.

Diego Ramírez Vásquez
quelle
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);
Safal Bhatia
quelle
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>
Dantalian
quelle
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);
Pratik Mohanrao Gondil
quelle
1

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

<activity name="MainActivity"
    android:windowSoftInputMode="stateVisible|adjustResize">
    ...
</activity>
Shivam Garg
quelle
1

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

android:fitsSystemWindows="true"
Darush
quelle
@ 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.

Omar Boshra
quelle
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.

Mahbubur Rahman Khan
quelle