Element in ScrollView an Bottom ausrichten, keine Chance!?

  • Antworten:3
  • Bentwortet
James Garo
  • Forum-Beiträge: 2

18.02.2018, 13:09:52 via Website

Hey Leute, ich bin neu hier und seit 3 Tagen befasse ich mich nun ausschließlich mit der Aufabe ein Layout in Android Studio zu entwerfen.
Hat auch alles soweit geklappt, sieht aus wie ich es haben wollte und das nach hundert versuchen in hundert verschiedenen Möglichkeiten der Ausführung. Dennnoch habe immer und immer wieder den selben Fehler der mich mittlerweile zur Verzweiflung bringt.

Ich habe ein Header Element für z.b. den App Namen, dann ein Footer Element für eine Texteingabe per EditText und dazwischen plaziert ist eine ScrollView.

In der ScrollView ein LinearLayout welches in Vertikaler anordnung so viele Elemente enthält dass ein Scrollen notwenig wird.

[Bild1]
image
(eigentlich sollte hier schon im Layout der letzte Text unten zu sehen sein statt der erste am oberen anfang, aber dazu später mehr)

Wenn ich jetzt runterscrolle zum Ende und dann auf EditText drücke wird die Tastatur aufgerufen und überdeckt das was am unteren Ende der ScrollView zu sehen ist und das ist nicht gewünscht.

[Bild2]
image
(runter gescrollt)

[Bild3]
image
(Tastatur eingeblendet, so sieht es zur Zeit aus)

Ich möchte aber dass der untere Bereich der zu sehen ist vom Inhalt der ScrollView auch zu sehen ist wenn die Tastatur eingeblendet wurde.

[Bild4]
image
(so sollte das Ergebnis aussehen wenn die Tastatur eingeblendet wurde)

Wenn ich das LinearLayout innerhalb der ScrollView auf layout_gravity="bottom" scheint genau das zuerst zu klappen was mir auch logisch erschien, aber dann passiert leider dass der obere bereich der nicht zu sehen ist abgeschnitten wird und beim scrollen nach unten ein leerraum entsteht der dem oben abgeschnittenen bereich in der höhe identisch ist.

[Bild5]
image
(Hier scrollt man in die falsche Richtung sozusagen deshalb hab ich es wieder auf top gesetzt)

Per Code mit ScrollView.FOCUS_DOWN funktioniert zwar als Notlösung aber ich denke es wäre sinnvoller das direkt übers Layout zu machen um nicht per code auf jede Layoutveränderung zu reagieren.

Im OnCreate rufe übrigens ich folgende Parameter auf um eine allgemeine Layoutverschiebung zu verhindern.

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

Ich weiss nach stundenlangem googeln und experimentieren nun keinen Rat mehr und hoffe dass mir einer nach meiner Lebensgeschichte hier ;) vielleicht helfen kann zumindest der Lösung ein wenig näher zu kommen.

Ich möchte einfach nur das ScrollView statt oben den Focus immer auf unten bzw auf die aktuelle Position hat und sich bei einer Layoutveränderung eben nur nach oben verschiebt aber nicht nach unten oder stehen bleibt. Alles andere Funktioniert jedenfalls nach meinen Vorstellungen.

Danke schonmal für eure Hilfe :)

Hier noch der Code der LayoutDatei:

<android.support.constraint.ConstraintLayout
xmlns:android="schemas.android.com/apk/res/android"
xmlns:app="schemas.android.com/apk/res-auto"
android:id="@+id/activity_test"
android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
    android:id="@+id/header"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:background="#212121"
    android:text=" List"
    android:textSize="35sp"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<LinearLayout
    android:id="@+id/footer"
    android:background="#212121"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="0dp"
    android:orientation="horizontal"
    app:layout_constraintBottom_toBottomOf="parent"
    >

    <EditText
        android:id="@+id/et"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Add Text..."
        android:textSize="14sp"
        />

</LinearLayout>
<ScrollView
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:fillViewport="true"
    android:isScrollContainer="false"
    app:layout_constraintBottom_toTopOf="@+id/footer"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/header"
    android:scrollIndicators="bottom"
    android:fadeScrollbars="false"
    android:scrollbarAlwaysDrawVerticalTrack="true">



    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="top"> //if i set to Bottom scrollbar scrolls wrong way see: [Bild5]

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_constraintBottom_toBottomOf="parent"
            >

            <TextView
                android:layout_width="match_parent"
                android:layout_height="20dp"
                android:text="Text1" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="20dp"
                android:text="Text2" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="20dp"
                android:text="Text3" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="20dp"
                android:text="Text4" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="20dp"
                android:text="Text5" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="20dp"
                android:text="Text6" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="20dp"
                android:text="Text7" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="20dp"
                android:text="Text8" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="20dp"
                android:text="Text9" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="20dp"
                android:text="Text10" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="20dp"
                android:text="Text11" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="20dp"
                android:text="Text12" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="20dp"
                android:text="Text13" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="20dp"
                android:text="Text14" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="20dp"
                android:text="Text15" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="20dp"
                android:text="Text16" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="20dp"
                android:text="Text17" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="20dp"
                android:text="Text18" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="20dp"
                android:text="Text19" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="20dp"
                android:text="Text20" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="20dp"
                android:text="Text21" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="20dp"
                android:text="Text22" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="20dp"
                android:text="Text23" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="20dp"
                android:text="Text24" />
        </LinearLayout>


    </android.support.constraint.ConstraintLayout>

</ScrollView>

— geändert am 18.02.2018, 13:22:05

Kommentieren
Beste Antwort
swa00
  • Forum-Beiträge: 3.704

18.02.2018, 19:25:15 via Website

Hallo James ,

Ich möchte einfach nur das ScrollView statt oben den Focus immer auf unten bzw auf die aktuelle Position hat und sich bei einer Layoutveränderung eben nur nach oben verschiebt aber nicht nach unten oder stehen bleibt. Alles andere Funktioniert jedenfalls nach meinen Vorstellungen.

wenn ich dein Problem richtig verstanden habe , dann kannst du dann per Code das sichtbare Item der Listview setzen ( also zur Runtime). Das Gleiche gilt für den ScrollView und seine ScrollPosition.

Übrigens : Das Verhalten ist im übrigen Android und Hersteller spezifisch abhängig.
Du wirst niemals deinen Wunsch Systemübergreiffend erreichen können

Ein kleiner Hinweis : ListView verwendet man nicht mehr, nimm einem ReycleView

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
James GaroPascal P.
Kommentieren
James Garo
  • Forum-Beiträge: 2

23.02.2018, 23:58:21 via Website

@swa00:

Also ich hab mir mal das RecycleView angeschaut und habe tatsächlich mein Vorhaben damit umsetzen können :)
Euer vorschlag mit dem per Code die Position zu setzen hatte ich vor meiner Frage bereits umgesetzt und das hat mich eben nicht zufrieden gestellt. Das RecycleView jedenfalls kann das Layout komplett umkehren so dass es den Fokus immer auf unten hat, somit kann am Layout passieren was will man wird immer den unteren Bereich von dem sehen wo man vorher war :)

Also vielen Dank für deinen Ratschlag mit den RecycleView, denke ohne das wäre ich heute noch am rum probieren :)

Ich komme eigentlich aus der .NET Entwicklung und habe bisher mit Layouts von Android nie zu tun gehabt. Eigentlich liebe ich es alle Funktionen einer Anwenung selber zu coden, aber mittlerweile geht so vieles im Layout schon, dass man sich manchmal Tage oder Wochen an Arbeit sparen kann um sich dann auf die eigentlichen bzw. eigenen Funktionen konzentrieren zu können. Ist bei .NET ja nicht viel anderst gelöst ;)

— geändert am 24.02.2018, 00:09:28

Hilfreich?
Kommentieren