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>
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.
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.
Sie können diesen Code ausprobieren:
scroller.post(new Runnable() {
public void run() {
scroller.fullScroll(ScrollView.FOCUS_DOWN);
}
});
[N: B] [Referenzlink] 1
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;
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.
Haben Sie die fullScroll-Methode ausprobiert?
yourScrollView.fullScroll(ScrollView.FOCUS_UP);
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.
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 :)
Füge diese beiden Zeilen in deiner ScrollView
ein
Android:focusableInTouchMode="true"
Android:descendantFocusability="blocksDescendants"
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.
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 .