Tastatur schließen Fragment Layout wird nicht aktualisiert

  • 5 Antworten
  • Letztes Antwortdatum
J

jokakilla

Neues Mitglied
1
Hallo zusammen,
ich habe eine App die aus einer Activity besteht in der die einzelnen Ansichten Fragmente sind zwischen denen gewechselt wird.
In bestimmten Fragmenten habe ich Probleme mit dem Layout. Das Fragment hat einige Textfelder und wenn man in eines der Felder klickt erscheint die Tastatur. Drückt man "back" verschwindet die Tastatur aber der Bereich wo die Tastatur war wird nicht neu gerendert.

Im Manifest ist für die Activity in der alles läuft android:windowSoftInputMode="adjustResize" gesetzt. Testweise habe ich auf dem ScrollView android:fillViewport="true" gesetzt. Beides hilft nicht.

ChatGpts "workaround" sieht so aus dass man im onCreate vom Fragment einen globalLayoutListener hinzufügt und requestLayout aufruft.
Code:
root.viewTreeObserver.addOnGlobalLayoutListener {
    root.requestLayout()
}
Das funktioniert zwar kann aber nicht im Sinne des Erfinders sein. Hat jemand eine Idee woran das Problem liegen könnte?
 

Anhänge

  • 1.jpg
    1.jpg
    417,3 KB · Aufrufe: 49
  • 2.jpg
    2.jpg
    331,1 KB · Aufrufe: 49
  • 3.jpg
    3.jpg
    408,8 KB · Aufrufe: 47
Das funktioniert zwar kann aber nicht im Sinne des Erfinders sein.
Doch ist es - und deshalb auch ein essentieller Callback für verschiedene Devices , deren UI und vor allem bei deinem Ablauf und Layoutaufbau. Hier muss explizit für jeden Hersteller nachgeabeitet werden .

Ich verwende in allen Views den LayoutListener und für EditFocus wird zusätzlich mit dem InputManager je nach API Version und Geräte UI korrigiert. Je komplexer das Layout, desto empfehlenswerter wird es.

Noch ein Grund :
android:windowSoftInputMode="adjustResize" findet bei dynamischen Elementen innerhalb eines vertikalen ScollViews keine Verwendung - Hier ist das manuelle Nacharbeiten eh ein MustHave.

Manchmal hilft es auch, ausschließlich Constraint zu verwenden


Anmerkung 1 :
rscheint die Tastatur. Drückt man "back" verschwindet die Tastatur aber der Bereich wo die Tastatur war wird nicht neu gerendert.
Das hört sich aber eher danach an , dass du der UI keine Luft lässt und zu wenig Threads / Handler verwendest.

Anmerkung 2 :
Lass mal dein Background-Bitmap raus - dort sollte man nach Möglichkeit auch Keine verwenden.
Eigentlich auch eher tödlich , wenn verschiedene Devices unterstützt werden sollen.
 
Zuletzt bearbeitet:
Puh anhand der Doku von android:windowSoftInputMode="adjustResize" hätte ich gedacht dass diese Einstellung genau dafür sorgt das Views (auch ScrollViews) beim öffnen der Tastatur verkleinert werden und entsprechend beim Verschwinden der Tastatur auch wieder vergrößert werden.

In dem View passiert Resourcentechnisch eigentlich nichts teures. Die Daten kommen aus einem ViewModel indem ich LiveData observe. Wenn etwas auf der Datenbank passiert mache ich das eigentlich in einer Coroutine im IO Dispatcher.

Das Problem tritt leider auch ohne Custom Background Bitmap auf.
Beiträge automatisch zusammengeführt:

Ich glaube was ich bisher übersehen habe ist dass das Problem nur in Fragmenten auftritt die in einem ViewPager2 sind.
Ich habe in meiner Activity dann ein Fragment:
Code:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <com.google.android.material.tabs.TabLayout
        android:id="@+id/showBatteryTabs"
        app:tabTextAppearance="@android:style/TextAppearance.Widget.TabWidget"
        app:tabSelectedTextColor="@color/darkThemeText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:tabMode="scrollable"
        android:background="@color/transparent" />

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/fragmentShowBattery"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</LinearLayout>

Und dort drin erzeuge ich dann die Fragmente die in den einzelnen ViewPager Seiten sein sollen:
Code:
    private inner class PageAdapter(fragment: Fragment) : FragmentStateAdapter(fragment) {
        override fun getItemCount(): Int {
            return 5
        }

        override fun createFragment(position: Int): Fragment {
            return when (position) {
                0 -> FragmentShowBatteryData.newInstance(viewModel.batteryId)
                1 -> FragmentShowBatteryMeasureGraphs.newInstance(viewModel.batteryId)
                2 -> FragmentShowBatteryMeasures.newInstance(viewModel.batteryId)
                3 -> FragmentShowBatteryLogs.newInstance(viewModel.batteryId)
                4 -> FragmentShowBatteryNotes.newInstance(viewModel.batteryId)
                else -> FragmentShowBatteryData.newInstance(viewModel.batteryId) //Should never happen
            }
        }
    }

Wenn ich statt des "Parent Fragment" mit dem ViewPager nur FragmentShowBatteryData öffne wird beim Schließen der Tastatur alles korrekt gerendert.
 
Zuletzt bearbeitet:
Es war auch nur eine Vermutung , da ich deinen Source nicht kenne :)

Entbindet dich allerdings nicht davon , dennoch manuell nachzuarbeiten.


Die Daten kommen aus einem ViewModel indem ich LiveData observe
P.S zu ViewModellen
Solltest du eine kleine Anzahl von Daten im ViewModel hin und her schicken - alles gut .
Wird es mehr - dann kommen die auch recht schnell an eine Grenze.

Da würde ich eher empfehlen, mit SingleTon zu arbeiten.
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: jokakilla
:1f648:
Code:
    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/fragmentShowBattery"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

Wenn man layout_height wrap_content zu match_parent macht ist der bug weg
 
Zuletzt bearbeitet:
Wenn man layout_height wrap_content zu match_parent macht ist der bug weg

Dann arbeitet dein Renderer zu viel - das hatte ich oben auch schon vermutet -> siehe meine Anmerkung zu Constraint.

Hintergrund : Manche Devices verarbeiten das Layout nicht auf deren GPU Kern - sondern nur auf der CPU.
Das ist auch bei Modellen wie die Pixel Geräte bis hinauf zu 7 der Fall.
Samsung ist schnell, Xiaomi grottig usw.

Jedesmal , wenn du wrap_content nimmst , wird jedes Element des Layout komplett neu berechnet - bei match_parent nur Notwendiges angepasst.

Ich persönlich verwende den Viewpager (2) gar nicht mehr , weil er schlichtweg zu langsam ist .
 

Ähnliche Themen

B
Antworten
9
Aufrufe
357
jogimuc
J
MES
Antworten
10
Aufrufe
1.171
MES
MES
M
  • MikelKatzengreis
2
Antworten
29
Aufrufe
1.327
jogimuc
J
Zurück
Oben Unten