Warum wird meine Android-Aktivität immer nach unten gescrollt?

91

Wenn ich diese Aktivität starte, beginnt sie immer auf dem Boden - ganz nach unten gescrollt. Ich mache nichts Seltsames in der Aktivität OnCreate (oder irgendwo sonst), von der ich erwarten würde, dass sie die Bildlaufposition ändert. Ich habe versucht, den Fokus auf das oberste fokussierbare Steuerelement und die Scrollto-Methode zu setzen, aber keines von beiden funktioniert. Außerdem hat keine meiner anderen Aktivitäten dieses Problem. Hier ist das Layout:

<ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/scroll"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/edit_refresh_update_header"
            android:textSize="18sp"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="\n"
            android:textSize="4sp"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Variable:"
            android:textSize="18sp"/>

        <Spinner
            android:id="@+id/edit_refresh_variables_spinner"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="\n"
            android:textSize="4sp"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Network:"
            android:textSize="18sp"/>

        <RadioGroup
            android:id="@+id/widget1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:orientation="vertical">

            <RadioButton
                android:text="Web"
                android:id="@+id/edit_refresh_update_rb_web"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="NetRadioButtonSelected"
                android:checked="true"/>

            <RadioButton
                android:text="Socket Server"
                android:id="@+id/edit_refresh_update_rb_socket_server"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="NetRadioButtonSelected"/>
        </RadioGroup>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="\n"
            android:textSize="4sp"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Socket server request type:"
            android:textSize="18sp"/>

        <Spinner
            android:id="@+id/edit_refresh_socket_server_req_types_spinner"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="\n"
            android:textSize="4sp"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Socket server body:"
            android:textSize="18sp"/>

        <EditText
            android:layout_width="match_parent"
            android:id="@+id/edit_refresh_update_ss_body"
            android:layout_height="wrap_content"
            android:enabled="false"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="\n"
            android:textSize="4sp"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Url:"
            android:textSize="18sp"/>

        <EditText
            android:layout_width="match_parent"
            android:id="@+id/edit_refresh_update_url"
            android:layout_height="wrap_content"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="\n"
            android:textSize="4sp"/>

        <Button
            android:text="Save refresh update"
            android:id="@+id/edit_refresh_save_btn"
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            android:layout_marginLeft="20dip"
            android:layout_marginRight="20dip"
            android:layout_marginBottom="20dp"
            android:layout_alignParentBottom="true"
            android:onClick="SaveRefreshUpdate">
        </Button>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="\n"
            android:textSize="4sp"/>
    </LinearLayout>
</ScrollView>
MrGibbage
quelle
Wie genau haben Sie versucht, den Fokus zu ändern?
devmiles.com
1
Verwenden der Fulscroll-Methode wie unten beschrieben und der Scrollto-Methode wie unten beschrieben. Es macht mir nicht unbedingt etwas aus, es auf diese Weise zu reparieren, aber es muss einen Grund geben, warum es so beginnt, und ich würde es lieber reparieren, indem ich das korrigiere.
MrGibbage

Antworten:

306

Wenn Android eine Aktivität startet, muss eine gewisse Kontrolle den Fokus haben. Wenn es kein bestimmtes Steuerelement gibt, das den Fokus übernehmen soll, wählt das System das erste in Frage kommende Steuerelement aus, das den Fokus haben soll. Wenn Sie die folgende Eigenschaft in Ihrem Linearlayout einstellen - android:focusableInTouchMode="true"Ihr LinearLayoutauf Start und Ihre Aktivität wird nicht Rolle zu konzentrieren EditTextim Boden.

devmiles.com
quelle
Funktioniert nicht in meinem GridLayout. Ich habe eine GridView in der Mitte des Layouts, die jedes Mal den Fokus erhält.
Iqbal
2
Ich kratzte mir einen ganzen Tag am Kopf und konnte nicht herausfinden, warum es in nur einer bestimmten Aktivität geschah, und ich verstehe es immer noch nicht, da ich die Fokussierung auf keine Ansicht aktiviert habe. Aber dank Ihnen konnte ich dieses Problem beheben. Es wäre großartig, wenn jemand etwas Licht auf den möglichen Grund werfen könnte, da ich in der neuen Aktivität nichts Neues mache.
Shubhral
2
Ein wichtiger Hinweis: Dies ist als Eigenschaft im LinearLayoutInneren ScrollViewund nicht in der Bildlaufansicht selbst hinzuzufügen .
Boris Strandjev
@ BorisStrandjev sehr wichtiger Hinweis. Sollte der Antwort hinzugefügt werden. Übrigens, danke dafür: P
Coreggon
Es wird buchstäblich in der Antwort erwähnt.
devmiles.com
35

Anstatt Elemente in Ihrem Layout zu verschmutzen, können Sie dies zu Ihrer Aktivität / Klasse hinzufügen:

    ScrollView scrollView = (ScrollView) findViewById(R.id.scrollView);
    scrollView.setFocusableInTouchMode(true); 
    scrollView.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);

Auf diese Weise ist es kein Element in Ihrer scrollView, das den Fokus erhält, sondern Ihre scrollView als Container, der den ersten Fokus erhält und danach in die untergeordnete Ansicht wechselt.

Graeme
quelle
Funktioniert teilweise für mich, wenn ich versuche, die ListView-Höhe basierend auf Kindern in ScrollView
Konstantin Konopko am
Das hat geholfen! (während die gleichen Attribute in XML nicht funktionierten ..)
Matan Dahan
Klappt wunderbar! Thx
Bogy
Es hat bei mir funktioniert, aber ich habe diese Zeile hinzugefügt: scrollView.fullScroll (ScrollView.FOCUS_UP) Beide getrennt haben nicht funktioniert.
Juan Giorello
3

Sie können diesen Code ausprobieren:

scroller.post(new Runnable() { 
    public void run() { 
        scroller.fullScroll(ScrollView.FOCUS_DOWN); 
    } 
}); 

[N: B] [Referenzlink] 1

Gemeinschaft
quelle
1
Es ist eine gute Option, aber es simuliert einen Ruck nach dem Öffnen, also keine gute Benutzererfahrung, denke ich
iBabur
2

Zusammen mit dem, was devmiles.com gesagt hat.

Wenn Sie die folgende Eigenschaft in Ihrem LinearLayout - android festlegen: focusableInTouchMode = "true", konzentriert sich Ihr LinearLayout auf den Start und Ihre Aktivität wird nicht zu EditText unten scrollen.

Wenn Sie requestLayout () für eine Ansicht am unteren Rand Ihres linearen Layouts aufrufen, wird möglicherweise der Fokus aus Ihrer obersten Ansicht gestohlen. Rufen Sie einfach requestFocus () in der obersten Ansicht des linearen Layouts auf, nachdem Sie requestLayout () in einer unteren Ansicht aufgerufen haben.

luca992
quelle
1

Haben Sie versucht, die fullScroll-Methode zu verwenden? Http: //developer.android.com/reference/android/widget/ScrollView.html#fullScroll (int)

yourScrollView.fullScroll(ScrollView.FOCUS_UP);
Mike
quelle
1

Wenn Sie für die Xamarin Android-Entwicklung eine @ Graeme-Lösung ausführen möchten, gehen Sie wie folgt vor:

// Set Focus to ScrollView
ScrollView scrollView = (ScrollView)FindViewById(Resource.Id.scrollView);
scrollView.FocusableInTouchMode = true;
scrollView.DescendantFocusability = Android.Views.DescendantFocusability.BeforeDescendants;
Asher Girlande
quelle
1

Machen Sie es einfach in onCreate () nicht fokussierbar

editText.setFocusable(false);

und verwenden

editText.setOnClickListener(new ....){
 ......
  editText.setFocusable(true);
  editText.setFocusableInTouchMode(true);
  editText.requestFocus();

  showSoftKeyboard(); //Use InputMethodManager to open soft Keyboard

 ......
 };

Beim nächsten Mal wird kein Fragment oder keine Aktivität erstellt.

Codepeaker
quelle
1

Fügen Sie diese beiden Zeilen in Ihre ScrollView

 android:focusableInTouchMode="true"
 android:descendantFocusability="blocksDescendants"
Hemendra Gangwar
quelle
0

Ich weiß nicht warum, aber du könntest damit experimentieren

ScrollView sv = (ScrollView) findViewById(R.id.scroll);
sv.scrollTo(0,0);

in Ihrer onCreateblättern sie manuell , wo Sie , wie es zu sein.

zapl
quelle
0

scrollView.requestFocus(View.FOCUS_UP)löste mein Problem, als ich wollte, dass die Draufsicht sichtbar ist. Die Angabe eines Richtungsparameters für die Methode requestFocus(int direction)ist eine gute Möglichkeit, die ScrollViewPosition zu steuern . Weitere Details hier .

Amit
quelle
0

In meinem Fall hatte ich ein VideoViewInside a ConstraintLayoutInside a ScrollView. Das hat VideoViewimmer den Fokus gestohlen, und es gibt Probleme damit . Die Lösung besteht darin, a zu verwenden TextureView. Hoffentlich hilft das jemandem, es hat mich mindestens eine Stunde gekostet :)

Daniel Wilson
quelle