web-dev-qa-db-de.com

Die Aktivität mit Fragmenten ändert sich nicht, wenn die Tastatur geöffnet wird

In meiner Haupttätigkeit gibt es eine RelativeLayout, die 2 Kinder hat:

  • Eine ImageView, die als Hintergrund dient
  • Ein LinearLayout, das über 2 Fragmentcontainer verfügt

activity_main.xml

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:layout_gravity="bottom"
    tools:context="${packageName}.${activityClass}">

    <ImageView
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:adjustViewBounds="true"
        Android:baselineAlignBottom="false"
        Android:scaleType="fitStart"
        Android:src="@drawable/bg_image" />

    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:orientation="vertical"
        Android:paddingTop="?android:attr/actionBarSize"
        Android:layout_alignParentBottom="true">

        <LinearLayout
            Android:id="@+id/ContainerA"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:layout_gravity="center"
            Android:orientation="vertical" />

        <LinearLayout
            Android:id="@+id/ContainerB"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:background="@color/background_gray"
            Android:orientation="vertical" />

    </LinearLayout>
</RelativeLayout>

Container A zeigt einfach ein Fragment, das sich nicht ändert.
Container B enthält jedoch ein Fragment, das sich in Abhängigkeit von den Klicks der Benutzer ändert. 

Container B ändert sich auf zwei Arten:

  • Es kann sich ausdehnen (von etwa 70% bis zur vollen Höhe).
  • Es verändert Fragmente.

Eines der Fragmente, die Container B enthalten kann, ist ein Formular, das EditTexts und andere Ansichten enthält. 

Mein Problem ist, dass ich die Größe der Aktivität nicht ändern kann, wenn die Tastatur geöffnet ist.
Ich habe adjustResize in der Manifest-Datei festgelegt, und mein Thema ist kein Vollbild-Design (es ist offensichtlich eine Ursache für dieses Problem). Ich habe auch versucht, die Ansichten zu bearbeiten, ScrollViews hinzuzufügen, aber absolut nichts hat funktioniert. 

Das Thema, das ich für diese Aktivität verwende, ist das helle Thema mit der dunklen Aktionsleiste aus der AppCompat-Bibliothek. Ich habe das Design nur bearbeitet, um eine Aktionsleiste mit Überlagerungen zu ermöglichen. Dies ist nicht das Problem, da ich bereits versucht habe, diese Änderungen ohne Erfolg zu entfernen.

Hier ist ein Link zum Formularlayout

TL; DRadjustResize/adjustPan funktionieren für mich nicht. Gesucht, verschiedene Lösungen ausprobiert, nichts hat funktioniert. Meine Frage ist; Was ist die Ursache in meinem Fall?

Update: AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android" ...>

    <uses-sdk Android:minSdkVersion="11" Android:targetSdkVersion="19" />

    <application ... Android:theme="@style/AppTheme">
        <activity Android:name=".SplashScreenActivity"
            Android:label="@string/app_name"
            Android:screenOrientation="portrait"
            Android:theme="@Android:style/Theme.Black.NoTitleBar">
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />

                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity Android:name=".MainActivity"
            Android:configChanges="keyboardHidden|screenSize" Android:label="@string/app_name"
            Android:screenOrientation="portrait" Android:theme="@style/OverlayActionBarTheme"
            Android:windowSoftInputMode="adjustResize"  />
        <activity Android:name=".SettingsActivity"
            Android:label="@string/title_activity_settings"
            Android:parentActivityName=".MainActivity"
            Android:windowSoftInputMode="adjustResize">
            <meta-data Android:name="Android.support.PARENT_ACTIVITY"
                Android:value=".MainActivity" />
        </activity>
    </application>

</manifest>

Update 2:
Ich erstellte eine komplett neue App, fügte mein Formularlayout als Hauptlayout hinzu und testete, ob das Problem im Layout selbst lag. Es stellt sich heraus, dass es auch in dieser neu erstellten App keine Größenänderung gibt.

Wie oben angegeben, ist der Link zum Layout Here

Update 3: Ich habe es geschafft, es in der neuen Anwendung zum Laufen zu bringen, indem ich das gesamte Layout mit einem ScrollView umrandete. Ich konnte den gleichen Effekt in der ursprünglichen App aus irgendeinem Grund nicht reproduzieren ... immer noch versuchen, herauszufinden, warum.

15
Asaf

Wenn die Soft-Tastatur auf dem Bildschirm angezeigt wird, verringert sich der für die Benutzeroberfläche der Anwendung verfügbare Platz. Das System entscheidet, wie der verfügbare Platz zwischen der Benutzeroberfläche der Anwendung und der Soft-Tastatur organisiert wird. 

  • Wenn der Fensterinhalt ListView, ScrollView enthält, wird die Größe des Anwendungsfensters geändert, sofern der gesamte Inhalt sichtbar ist.
  • Wenn eine Größenänderung nicht möglich ist, wird der pan and scan-Ansatz verwendet, bei dem einfach das Anwendungsfenster gescrollt wird, sodass die aktuell fokussierte Ansicht sichtbar ist. 

Da Ihr Layout keine ListView, ScrollView _ enthält, ist eine Größenänderung nicht möglich.

Die Wurzelansicht des Fensters ist FrameLayout, zu der Sie ursprünglich LinearLayout hinzugefügt haben. Da LinearLayout das Scrollen nicht unterstützt, ist der pan and scan-Ansatz ebenfalls ausgeschlossen. Durch das Umschließen des Layouts in ScrollView wird daher das Bildlaufproblem gelöst.

Sie können Android Developers Blog für weitere Details verweisen.

Update 1:

Das OP konnte das Problem lösen, wie in dieser Antwort angegeben. Das Problem geschah, weil ein Fragment nach der Animation ein anderes Fragment überlagerte und das übergeordnete Element dieser Fragments ein LinearLayout war. Für die Überlagerung müssen Sie nur RelativeLayout oder FrameLayout verwenden.

19
Manish Mulimani

Um den Modus zu ändern, ändern Sie bei der folgenden Anweisung Ihre Aktivität in "AndroidManifest.xml".

 <activity Android:name=".ActivityName"
        Android:windowSoftInputMode="adjustResize">

und entfernen Sie bitte die Komplexität von LinearLayout (bedeutet, dass Sie mehrere Ebenen von LinearLayout verwenden). Stattdessen können Sie RelativeLayout auch verwenden. Mit diesem können Sie das Layout ganz einfach einstellen, wie Sie möchten 

Ich hoffe das hilft. 

11

Sie können diesen Code auch in Ihrem Fragment verwenden

Dieser Code bietet Hilfe zur Größenänderung der Ansicht

public static class MyDialog extends DialogFragment {

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    // Dialog layout inflater code
    // getDialog() need to be called only after onCreateDialog(), which is invoked between onCreate() and onCreateView(). 
      getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN |     WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
   // return view code
  }
}
9
Ramkailash

verwenden Sie diese Zeile in Ihrer Manifestdatei gegen Ihre Aktivität, in der Sie Ihr Ergebnis wünschen hoffe, es wird Ihnen helfen

   Android:windowSoftInputMode="adjustPan|stateAlwaysHidden" 

mögen

  <activity
            Android:name="com.Android.youractivity"
            Android:windowSoftInputMode="adjustPan|stateAlwaysHidden" />

Es stellte sich heraus, dass mein Problem durch eine völlig unerwartete Quelle verursacht wurde. 

Was passiert ist, ist, dass ich eine LinearLayout als übergeordnetes Element meiner zwei Fragment-Container verwendet habe.
Dann hob ich in meiner sich erweiternden Animation den unteren Container an, um den anderen zu überlappen.

Ich weiß nicht wirklich warum , aber da LinearLayout keine überlappenden Kinder enthalten soll, löste das Umschalten auf eine RelativeLayout oder eine FrameLayout das Problem sofort.

Da diese Ursache aus dem von mir veröffentlichten Code möglicherweise nicht ersichtlich ist, möchte ich mich für den Mangel an Informationen entschuldigen und werde die detaillierteste Antwort als die beste ansehen.

4
Asaf

Verwenden Sie dies in onCreateDialog in BottomSheetFragment/Dailogfragment

KeyboardUtil(getActivity(), view);

oder 

Für Fragmentgebrauch 

new KeyboardUtil(this, findViewById(R.id.fragment_container));

mit dieser Util-Klasse 

https://github.com/mikepenz/MaterialDrawer/blob/aa9136fb4f5b3a80460fe5f47213985026d20c88/library/src/main/Java/com/mikepenz/materialdrawer/util/KeyboardUtil.Java

Bildnachweis: Mikepenz 

1
LOG_TAG

Fügen Sie diese Codezeile in DialogFragment Oncreateview unter R.layout.layout_ui hinzu

getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN |     WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
0
Kishore Reddy