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?
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.
Sie können diesen Code auch in der onCreate()
-Methode verwenden:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Fügen Sie in AndroidManifest.xml Ihre Aktivität hinzu:
Android:windowSoftInputMode="adjustPan|adjustResize"
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);
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.!!!!!!!!!!!!
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
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);
Es gibt drei Schritte, um den Bildschirm nach oben zu rollen.
Android: windowSoftInputMode = "adjustResize"
getWindow (). setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
<?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.
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>
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>
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>
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.
Ich habe gerade die folgende Zeile zum Layout der obersten Ebene hinzugefügt und alles hat funktioniert:
Android:fitsSystemWindows="true"
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