webentwicklung-frage-antwort-db.com.de

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

Immer wenn ich mit dieser Aktivität beginne, beginnt sie immer mit dem Boden nach unten - ganz nach unten gescrollt. Ich mache nichts Ungewöhnliches in der Aktivität OnCreate (oder irgendwo sonst), bei der ich die Bildlaufposition ändern würde. Ich habe versucht, den Fokus auf das oberste fokussierbare Steuerelement und die Scrollto-Methode einzustellen, aber beide funktionieren nicht. 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>
81
MrGibbage

Wenn Android eine Aktivität startet, müssen einige Steuerelemente den Fokus haben. Wenn es kein bestimmtes Steuerelement gibt, das den Fokus annehmen soll, wählt das System das erste in Frage kommende Steuerelement aus, das den Fokus erhalten soll .. Wenn Sie die folgende Eigenschaft in LinearLayout festlegen, wird Android:focusableInTouchMode="true" Ihre LinearLayout auf den Start konzentriert und Ihre Aktivität wird nicht zu EditText blättern im unteren.

279
devmiles.com

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 Ihrem scrollView, das den Fokus erhält. Es ist Ihr scrollView als Container, der den ersten Fokus erhält und sich danach auf die untergeordnete Ansicht bewegt.

28
Graeme

Sie können diesen Code ausprobieren:

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

[N: B] [Referenzlink] 1

3
user4356416

Wenn Sie für die Xamarin-Android-Entwicklung eine @Graeme-Lösung verwenden möchten, dann

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

Zusammen mit dem, was devmiles.com gesagt hat. 

Wenn Sie in Ihrem LinearLayout - Android die folgende Eigenschaft festlegen: focusableInTouchMode = "true", wird Ihr LinearLayout beim Start konzentriert und Ihre Aktivität wird nicht zu EditText im unteren Bereich blättern.

Wenn Sie requestLayout () für eine Ansicht am unteren Rand Ihres linearen Layouts aufrufen, stiehlt dies möglicherweise den Fokus aus Ihrer obersten Ansicht. Rufen Sie also requestFocus () ganz oben in der linearen Ansicht auf, nachdem Sie requestLayout () in einer unteren Ansicht aufgerufen haben.

1
luca992

Haben Sie die fullScroll-Methode ausprobiert?

yourScrollView.fullScroll(ScrollView.FOCUS_UP);
1
Mike

Mach es einfach nicht fokussierbar in onCreate ()

editText.setFocusable(false);

und verwenden 

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

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

 ......
 };

und es wird beim nächsten Mal nicht zu Edittext gescrollt, ein Fragment oder eine Aktivität wird erstellt.

0
codepeaker

In meinem Fall hatte ich eine VideoView in einer ConstraintLayout in einer ScrollView. Die VideoView hat immer den Fokus gestohlen, und es gibt Probleme damit . Lösung ist die Verwendung einer TextureView. Hoffentlich hilft das jemandem, es kostet mich mindestens eine Stunde :)

0
Daniel Wilson

Füge diese beiden Zeilen in deiner ScrollView ein 

 Android:focusableInTouchMode="true"
 Android:descendantFocusability="blocksDescendants"
0

Ich weiß nicht warum, aber Sie könnten damit experimentieren

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

in Ihrer onCreate, um sie manuell dorthin zu scrollen, wo Sie sie haben möchten.

0
zapl

scrollView.requestFocus(View.FOCUS_UP) hat mein Problem gelöst, als ich wollte, dass die Draufsicht sichtbar ist . Die Angabe des Richtungsparameters für die Methode requestFocus(int direction) ist eine gute Möglichkeit, die ScrollView-Position zu steuern. Weitere Details hier .

0
Amit