Bewegen Sie Layouts, wenn Soft-Tastatur angezeigt wird?
-
21-09-2019 - |
Frage
Ich habe ein paar Elemente in einem RelativeView mit dem align Boden-Attribute gesetzt ist, wenn die Soft-Tastatur kommt die Elemente von der Soft-Tastatur versteckt.
Ich mag sie so bewegen, dass, wenn es genug Platz auf dem Bildschirm ist, werden sie über der Tastatur angezeigt, oder den Abschnitt oberhalb der Tastatur scrollbaren zu machen, damit der Benutzer immer noch die Elemente sehen kann.
Alle Ideen, wie man diesen Ansatz?
Lösung
Ja Besuche diesem Artikel auf der Android Entwickler-Website die beschreibt, wie die Rahmen Griffe die Soft-Tastatur erscheint.
Das android:windowSoftInputMode
Attribut verwendet werden kann, um festzulegen, was auf einer Pro-Aktivität Basis geschieht., Ob das Layout der Größe verändert wird, oder ob es scrollt etc
Andere Tipps
Sie können auch diesen Code in onCreate()
Methode verwenden:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Fügen Sie in AndroidManifest.xml für Ihre Aktivität:
android:windowSoftInputMode="adjustPan|adjustResize"
Änderungen in der Aktivität Ihrer Manifest-Datei wie
windowSoftInputMode="adjustResize"
oder
Nehmen Sie Änderungen in Ihrer onCreate()
Methode in der Aktivitätsklasse wie
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
ähnliches Problem i war vor mit meinem Layout, die Bildlaufansicht innen bestehen. Jedes Mal, wenn ich versuche, Text zu markieren in EditText, Kopieren / Ausschneiden / Einfügen Aktionsleiste wird mit folgendem Code als solche nach oben bewegt, es funktioniert nicht Resize Layout
android:windowSoftInputMode="adjustPan"
Durch sie wie unten modifizierenden
1) AndroidManifest.xml
android:windowSoftInputMode="stateVisible|adjustResize"
2) style.xml Datei, in der Aktivität Stil
<item name="android:windowActionBarOverlay">true</item>
Es funktionierte. !!!!!!!!!!!!
In AndroidManifest.xml, nicht vergessen Satz:
android:windowSoftInputMode="adjustResize"
und für RelativeLayout innerhalb Scrollview, festlegen:
android:layout_gravity="center" or android:layout_gravity="bottom"
es wird in Ordnung sein
für Aktivität in seinem oncreate Methode Einsatz unterhalb der Linie
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 3 Schritte, um Scroll-Bildschirm.
folgen- Schreiben in Manifest-Datei für Ihre Tätigkeit:
Android: windowSoftInputMode = "adjustResize"
- Fügen Sie folgende Zeile in oncreate () -Methode Ihrer Aktivität
getWindow () setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);.
- Dann legen Sie Ihre ganze Sicht in "Scroll" in 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, hinzuzufügen android. layout_gravity = "center" in Mutter Relative Layout
ich eine Methode von Diego Ramírez versucht, 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, dass es wie bei Ihnen ziemlich gleiche ist.
Zunächst einmal, ich habe nur ein Linearlayout mit zwei Elementen, einem Image und einem Linearlayout Wich enthält 2 EditText und ein Knopf, so musste ich sie getrennt halten in vollem Umfang nutzen, ohne Tastatur, und wenn die Tastatur erscheint, sollten sie aussehen näher.
hinzugefügt, damit ich die Ansicht zwischen ihnen mit der Höhe Attribut in 0DP und Gewicht 1, das lassen Sie mich halten meine Ansichten trennen man einander bilden. und wenn die Tastatur Appers, da sie nicht über eine fixe Höhe haben, sie nur die Größe und das Aussehen behalten.
Voila! Das Layout Resize und der Abstand zwischen meinen Ansichten ist das gleiche, wenn die Tastatur ist oder nicht vorhanden ist.
Hier ist voll manifest Code
<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 in Fragmente sind, dann müssen Sie die folgenden Code in Ihre onCreate auf Ihrer Aktivität hinzufügen löst es Problem für mich
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
In Ihrer Manifest-Datei hinzufügen, die unterhalb der Linie. Es wird funktionieren
<activity name="MainActivity"
android:windowSoftInputMode="stateVisible|adjustResize">
...
</activity>
Okay das ist sehr spät aber ich habe festgestellt, dass, wenn Sie eine Listenansicht unter dem Bearbeiten von Text fügen Sie dann die Tastatur alle Layouts unter diesem EditText bewegen wird, ohne dass die Listview zu bewegen
<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 gearbeitet.
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
Ich habe gerade die folgende Zeile in der obersten Ebene Layout hinzugefügt und alles hat funktioniert:
android:fitsSystemWindows="true"