web-dev-qa-db-ger.com

Layouts nach oben verschieben, wenn die Soft-Tastatur angezeigt wird

Ich habe ein paar Elemente in einem RelativeView mit dem Attribut Align Bottom. Wenn die Soft-Tastatur erscheint, werden die Elemente von der Soft-Tastatur ausgeblendet.

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

Irgendwelche Ideen, wie man das angehen kann?

107
Dinedal

Ja, check out dieser Artikel auf der Android-Entwicklerseite beschreibt, wie das Framework die erscheinende Soft-Tastatur behandelt.

Das Android:windowSoftInputMode-Attribut kann verwendet werden, um anzugeben, was auf Aktivitätsbasis geschieht: ob die Größe des Layouts geändert wird oder ob es einen Bildlauf durchführt usw.

83
Christopher Orr

Sie können diesen Code auch in der onCreate()-Methode verwenden:

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

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

Android:windowSoftInputMode="adjustPan|adjustResize"
30

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

windowSoftInputMode="adjustResize"

ODER

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

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
20
Jose Kurian

ein ähnliches Problem hatte ich mit meinem Layout zu tun, das aus einer Scroll-Ansicht besteht. Wenn ich versuche, Text in EditText auszuwählen, wird die Aktionsleiste Kopieren/Ausschneiden/Einfügen mit dem folgenden Code nach oben verschoben, sodass das Layout nicht geändert wird

Android:windowSoftInputMode="adjustPan"

Ändern Sie es wie folgt 

1) AndroidManifest.xml 

Android:windowSoftInputMode="stateVisible|adjustResize"

2) style.xml-Datei im Aktivitätsstil

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

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

14
Ronak Poriya

Vergessen Sie nicht in AndroidManifest.xml Folgendes einzustellen:

 Android:windowSoftInputMode="adjustResize"

und für RelativeLayout in ScrollView:

 Android:layout_gravity="center" or Android:layout_gravity="bottom" 

es wird okay sein

9
Zahra.HY

for Activity in seiner Oncreate-Methode unter der Zeile einfügen 

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

Es gibt drei Schritte, um den Bildschirm nach oben zu rollen.

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

Android: windowSoftInputMode = "adjustResize"

  1. Fügen Sie der oncreate () -Methode Ihrer Aktivität folgende Zeile hinzu 

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

  1. Dann platzieren Sie Ihre gesamte Ansicht in "Scrollview" in einer XML-Datei wie:
<?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>

P.S. Vergessen Sie nicht, Android: layout_gravity = "center" im übergeordneten relativen Layout hinzuzufügen.

5
Heena Arora

Ich habe eine Methode von Diego Ramírez ausprobiert, es 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>
4
CoolMind

Ich habe eine Lösung für meine Probleme gefunden, die der Ihren sehr ähnlich ist.

Zunächst habe ich nur ein LinearLayout mit 2 Elementen, ein ImageView und ein LinearLayout, das 2 EditText und einen Button enthält. Daher musste ich sie im Vollbildmodus ohne Tastatur voneinander trennen. Wenn die Tastatur erscheint, sollten sie genauer hinsehen.

Also fügte ich die Ansicht mit dem Höhenattribut in 0dp und Gewicht 1 hinzu, sodass ich meine Ansichten voneinander trennen kann. und wenn die Tastatur erscheint, da sie keine feste Höhe hat, wird die Größe einfach geändert und der Aspekt bleibt erhalten.

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

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
Dantalian

wenn Sie sich in Fragmenten befinden, müssen Sie den folgenden Code zu Ihrem onCreate in Ihrer Aktivität hinzufügen

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

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

<activity name="MainActivity"
    Android:windowSoftInputMode="stateVisible|adjustResize">
    ...
</activity>
0
Shivam Garg

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

<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
Omar Ahmed

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

Android:fitsSystemWindows="true"
0
Darush

 enter image description here

Here is the solution for this fix
- Android:windowSoftInputMode="adjustResize" in Manifest File
- Make a class "CommentKeyBoardFix.Java" and copy and paste the below code.

public class CommentKeyBoardFix
{
private View mChildOfContent;
private int usableHeightPrevious;
private FrameLayout.LayoutParams frameLayoutParams;
private Rect contentAreaOfWindowBounds = new Rect();

public CommentKeyBoardFix(Activity activity)
{
    FrameLayout content = activity.findViewById(Android.R.id.content);
    mChildOfContent = content.getChildAt(0);
    mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(this::possiblyResizeChildOfContent);
    frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams();
}

private void possiblyResizeChildOfContent()
{
    int usableHeightNow = computeUsableHeight();
    if (usableHeightNow != usableHeightPrevious)
    {
        int heightDifference = 0;
        if (heightDifference > (usableHeightNow /4))
        {
            // keyboard probably just became visible
            frameLayoutParams.height = usableHeightNow - heightDifference;
        }
        else
        {
            // keyboard probably just became hidden
            frameLayoutParams.height = usableHeightNow;
        }
        mChildOfContent.layout(contentAreaOfWindowBounds.left, contentAreaOfWindowBounds.top, contentAreaOfWindowBounds.right, contentAreaOfWindowBounds.bottom);
        mChildOfContent.requestLayout();
        usableHeightPrevious = usableHeightNow;
    }
}

private int computeUsableHeight()
{
    mChildOfContent.getWindowVisibleDisplayFrame(contentAreaOfWindowBounds);
    return contentAreaOfWindowBounds.height();
}
}

And then call this class in your Activity or Fragment
setContentView(R.layout.your_comments_layout)
CommentKeyBoardFix(this) ---> For Kotlin
or
new CommentKeyBoardFix(this) ---> For Java
0
yash786