Ich habe eine sehr lange Aktivität mit einer Bildlaufansicht. Es ist ein Formular mit verschiedenen Feldern, die der Benutzer ausfüllen muss. Ich habe ein Kontrollkästchen in der Mitte meines Formulars, und wenn der Benutzer es aktiviert, möchte ich zu einem bestimmten Teil der Ansicht scrollen. Gibt es eine Möglichkeit, programmgesteuert zu einem EditText-Objekt (oder einem anderen Ansichtsobjekt) zu scrollen?
Ich weiß auch, dass dies mit X- und Y-Koordinaten möglich ist, aber ich möchte dies vermeiden, da sich das Formular von Benutzer zu Benutzer ändern kann.
android
view
android-edittext
scrollview
programmatically-created
NotACleverMan
quelle
quelle
the form may changed from user to user
aber Sie können nur verwendenmEditView.getTop();
Antworten:
quelle
your_scrollview.post(...
Die Antwort von Sherif elKhatib kann erheblich verbessert werden, wenn Sie die Ansicht in die Mitte der Bildlaufansicht scrollen möchten . Mit dieser wiederverwendbaren Methode wird die Ansicht sanft in die sichtbare Mitte einer HorizontalScrollView verschoben.
Für eine vertikale
ScrollView
Änderung derx
undy
Position der Eingänge vonsmoothScroll
. Und verwenden Sieview.getTop()
anstelle vonview.getLeft()
undview.getBottom()
anstelle vonv.getRight()
.:) :)
quelle
Das funktioniert gut für mich:
Kind - Das Kind dieses ViewParent, das den Fokus haben möchte. Diese Ansicht enthält die fokussierte Ansicht. Es ist nicht unbedingt die Ansicht, die tatsächlich den Fokus hat.
fokussiert - Die Ansicht, die ein Nachkomme eines Kindes ist, das tatsächlich fokussiert ist
quelle
Meiner Meinung nach ist der beste Weg, um zu einem bestimmten Rechteck zu scrollen, via
View.requestRectangleOnScreen(Rect, Boolean)
. Sie sollten es auf einemView
Bild aufrufen, zu dem Sie einen Bildlauf durchführen möchten, und ein lokales Rechteck übergeben, das auf dem Bildschirm sichtbar sein soll. Der zweite Parameter solltefalse
für das reibungslose Scrollen undtrue
für das sofortige Scrollen sein.quelle
scrollview.smoothScrollTo
wird nicht funktionieren, wenn die erforderliche Ansicht außerhalb des Bildschirms ist (versucht im Android-Emulator mit SDK-Version 26)new Handler().post()
?Ich habe eine kleine Dienstprogrammmethode basierend auf Answer from WarrenFaith erstellt. Dieser Code berücksichtigt auch, ob diese Ansicht bereits in der Bildlaufansicht sichtbar ist und kein Bildlauf erforderlich ist.
quelle
scrollBounds
sollte der Parameter für diescrollView.getHitRect
Methode sein.Sie sollten Ihre
TextView
Anfrage fokussieren:quelle
Mein EditText war mehrere Ebenen in meiner ScrollView verschachtelt, die selbst nicht die Stammansicht des Layouts ist. Da getTop () und getBottom () die Koordinaten in der enthaltenen Ansicht zu melden schienen, ließ ich den Abstand vom oberen Rand der ScrollView zum oberen Rand des EditText berechnen, indem ich die übergeordneten Elemente des EditText durchlief.
quelle
Eine andere Variante wäre:
oder Sie können die
post()
Methode verwenden.quelle
Ich weiß, dass dies für eine bessere Antwort zu spät sein kann, aber eine gewünschte perfekte Lösung muss ein System wie ein Positionierer sein. Ich meine, wenn das System eine Position für ein Editor-Feld vornimmt, platziert es das Feld nur bis zur Tastatur, so dass es nach UI / UX-Regeln perfekt ist.
Was der folgende Code macht, ist die reibungslose Positionierung von Android. Zunächst behalten wir den aktuellen Bildlaufpunkt als Referenzpunkt bei. Zweitens müssen Sie den besten Positionierungs-Bildlaufpunkt für einen Editor finden. Dazu scrollen wir nach oben und fordern die Editorfelder auf, die ScrollView-Komponente so zu gestalten, dass sie die beste Positionierung ausführt. Gatcha! Wir haben die beste Position gelernt. Jetzt scrollen wir reibungslos vom vorherigen Punkt zu dem Punkt, den wir neu gefunden haben. Wenn Sie möchten, können Sie das reibungslose Scrollen unterlassen, indem Sie scrollTo anstelle vonoothScrollTo verwenden .
HINWEIS: Der Hauptcontainer ScrollView ist ein Mitgliedsfeld mit dem Namen scrollViewSignup, da mein Beispiel ein Anmeldebildschirm war, wie Sie vielleicht viel herausfinden.
Wenn Sie diesen Block für alle EditText- Instanzen verwenden und ihn schnell in Ihren Bildschirmcode integrieren möchten . Sie können einfach einen Traverser wie unten erstellen. Zu diesem Zweck habe ich den OnFocusChangeListener-Hauptbereich zu einem Mitgliedsfeld mit dem Namen focusChangeListenerToScrollEditor gemacht und ihn während onCreate wie folgt aufgerufen.
Und die Methodenimplementierung ist wie folgt.
Wir haben hier also alle EditText-Instanzkinder dazu gebracht, den Listener im Fokus aufzurufen.
Um diese Lösung zu erreichen, habe ich alle Lösungen hier überprüft und eine neue Lösung für ein besseres UI / UX-Ergebnis generiert.
quelle
Die obigen Antworten funktionieren einwandfrei, wenn ScrollView das direkte übergeordnete Element von ChildView ist. Wenn Ihre ChildView in eine andere ViewGroup in der ScrollView eingeschlossen wird, führt dies zu unerwartetem Verhalten, da View.getTop () die Position relativ zu der übergeordneten Version erhält. In diesem Fall müssen Sie Folgendes implementieren:
quelle
Referenz: https://stackoverflow.com/a/6438240/2624806
Das Folgen funktionierte viel besser.
quelle
Ich denke, ich habe eine elegantere und weniger fehleranfällige Lösung gefunden
Es ist keine Mathematik erforderlich, und im Gegensatz zu anderen vorgeschlagenen Lösungen wird das korrekte Scrollen sowohl nach oben als auch nach unten behandelt.
Es ist eine gute Idee, es einzuwickeln
postDelayed
, um es zuverlässiger zu machen, falls dasScrollView
gerade geändert wirdquelle
Wenn Sie den Android-Quellcode untersuchen, können Sie feststellen, dass es bereits eine Mitgliedsfunktion von
ScrollView
-scrollToChild(View)
- gibt, die genau das tut, was angefordert wird. Leider ist diese Funktion aus einem unbekannten Grund markiertprivate
. Basierend auf dieser Funktion habe ich folgende Funktion geschrieben, die die ersteScrollView
über demView
als Parameter angegebenen Funktion findet und sie so scrollt, dass sie im folgenden Bereich sichtbar wirdScrollView
:quelle
Meine Lösung ist:
quelle
Antwort aus meinem praktischen Projekt.
quelle
In meinem Fall ist das nicht
EditText
, das istgoogleMap
. Und so funktioniert es erfolgreich.quelle
Que: Gibt es eine Möglichkeit, eine Bildlaufansicht programmgesteuert zu einem bestimmten Edittext zu scrollen?
Antwort: Verschachtelte Bildlaufansicht in der Recycling-Ansicht Letzte Position hinzugefügt Datensatzdaten.
Gibt es eine Möglichkeit, eine Bildlaufansicht programmgesteuert zu einem bestimmten Bearbeitungstext zu scrollen?
quelle
Folgendes verwende ich:
Dadurch wird der Bildlaufbetrag abgerufen, der erforderlich ist, um den unteren Rand der Ansicht anzuzeigen, einschließlich aller Ränder am unteren Rand dieser Ansicht.
quelle
Vertikale Schriftrolle, gut für Formulare. Die Antwort basiert auf der horizontalen Schriftrolle von Ahmadalibaloch.
quelle
HorizontalScrollView
bei dieser Methode ein verwenden sollten?Sie können
ObjectAnimator
wie folgt verwenden:quelle
Basierend auf Sherifs Antwort funktionierte das Folgende am besten für meinen Anwendungsfall. Bemerkenswerte Änderungen sind
getTop()
anstelle vongetBottom()
undsmoothScrollTo()
anstelle vonscrollTo()
.quelle
Wenn scrlMain Ihre NestedScrollView ist, verwenden Sie Folgendes:
quelle