Mam bardzo długą aktywność z przewijaniem. Jest to formularz z różnymi polami, które użytkownik musi wypełnić. Mam pole wyboru w połowie mojego formularza, a gdy użytkownik je sprawdzi, chcę przewinąć do określonej części widoku. Czy istnieje jakiś sposób programowego przewijania do obiektu EditText (lub innego obiektu widoku)?
Wiem też, że jest to możliwe przy użyciu współrzędnych X i Y, ale chcę tego uniknąć, ponieważ formularz może się zmieniać w zależności od użytkownika.
android
view
android-edittext
scrollview
programmatically-created
NotACleverMan
źródło
źródło
the form may changed from user to user
ale możesz po prostu użyćmEditView.getTop();
Odpowiedzi:
źródło
your_scrollview.post(...
Odpowiedź Sherif elKhatib może zostać znacznie ulepszona, jeśli chcesz przewinąć widok do środka widoku przewijania . Ta metoda wielokrotnego użytku płynnie przewija widok do widocznego środka HorizontalScrollView.
Do
ScrollView
użytku pionowegoźródło
Działa to dla mnie dobrze:
child - Dziecko tego ViewParent, które chce się skupić. Ten widok będzie zawierał widok skupiony. Niekoniecznie musi to być widok.
skoncentrowany - widok, który jest potomkiem dziecka, który faktycznie jest skupiony
źródło
Moim zdaniem najlepszym sposobem przewijania do danego prostokąta jest
View.requestRectangleOnScreen(Rect, Boolean)
. Powinieneś zadzwonić na miejsce, doView
którego chcesz przewinąć i przekazać lokalny prostokąt, który ma być widoczny na ekranie. Drugim parametrem powinno byćfalse
płynne przewijanie itrue
natychmiastowe przewijanie.źródło
scrollview.smoothScrollTo
nie zadziała, jeśli wymagany widok jest poza ekranem, (wypróbowany w emulatorze Androida z wersją 26 SDK)new Handler().post()
?Zrobiłem małą metodę narzędzia opartą na odpowiedzi z WarrenFaith, ten kod bierze również pod uwagę, jeśli ten widok jest już widoczny w widoku przewijania, nie ma potrzeby przewijania.
źródło
scrollBounds
powinien być parametrem tejscrollView.getHitRect
metody.Powinieneś
TextView
skupić się na swoim żądaniu:źródło
Mój EditText został zagnieżdżony kilka warstw w moim ScrollView, który sam nie jest głównym widokiem układu. Ponieważ getTop () i getBottom () zdawały się zgłaszać współrzędne w obrębie zawierającego widok, kazałem mu obliczyć odległość od górnej części ScrollView do górnej części EditText poprzez iterację przez rodziców EditText.
źródło
Inną odmianą byłoby:
lub możesz użyć tej
post()
metody.źródło
Wiem, że może być za późno na lepszą odpowiedź, ale pożądanym idealnym rozwiązaniem musi być systemowy pozycjoner. Mam na myśli, że gdy system dokonuje pozycjonowania dla pola edytora, umieszcza to pole tylko do klawiatury, więc zgodnie z regułami UI / UX jest on idealny.
Poniższy kod sprawia, że pozycjonowanie w systemie Android przebiega płynnie. Przede wszystkim utrzymujemy bieżący punkt przewijania jako punkt odniesienia. Po drugie, znajdź najlepszy punkt pozycjonowania przewijania dla edytora, w tym celu przewijamy do góry, a następnie żądamy od pól edytora, aby komponent ScrollView wykonał najlepsze pozycjonowanie. Gatcha! Nauczyliśmy się najlepszej pozycji. Teraz będziemy płynnie przewijać od poprzedniego punktu do punktu, który niedawno odnaleźliśmy. Jeśli chcesz, możesz pominąć płynne przewijanie za pomocą scrollTo zamiast tylko smoothScrollTo .
UWAGA: Główny kontener ScrollView jest polem członkowskim o nazwie scrollViewSignup, ponieważ mój przykład był ekranem rejestracyjnym, jak można się wiele domyślić.
Jeśli chcesz użyć tego bloku dla wszystkich instancji EditText i szybko zintegruj go ze swoim kodem ekranowym. Możesz po prostu zrobić trawers jak poniżej. Aby to zrobić, uczyniłem z głównego OnFocusChangeListener pole członka o nazwie focusChangeListenerToScrollEditor i wywołałem go podczas onCreate, jak poniżej.
A implementacja metody jest następująca.
To, co zrobiliśmy tutaj, sprawia, że wszystkie dzieci instancji EditText są w stanie wywoływać nasłuchiwanie.
Aby osiągnąć to rozwiązanie, sprawdziłem wszystkie rozwiązania tutaj i wygenerowałem nowe rozwiązanie dla lepszego wyniku UI / UX.
źródło
Powyższe odpowiedzi będą działać poprawnie, jeśli ScrollView jest bezpośrednim rodzicem ChildView. Jeśli twój ChildView jest zawijany w innej ViewGroup w ScrollView, spowoduje to nieoczekiwane zachowanie, ponieważ View.getTop () otrzymuje pozycję względem swojego rodzica. W takim przypadku musisz to zaimplementować:
źródło
odniesienie: https://stackoverflow.com/a/6438240/2624806
Obserwowanie działało znacznie lepiej.
źródło
Myślę, że znalazłem bardziej eleganckie i mniej podatne na błędy rozwiązanie
Nie wymaga matematyki i w przeciwieństwie do innych proponowanych rozwiązań, poradzi sobie z prawidłowym przewijaniem w górę i w dół.
Dobrym pomysłem jest owinięcie go,
postDelayed
aby uczynić go bardziej niezawodnym, na wypadek, gdybyScrollView
w tej chwili był zmienianyźródło
Analizując kod źródłowy Androida, możesz stwierdzić, że istnieje już funkcja członka
ScrollView
-scrollToChild(View)
- która robi dokładnie to, o co prosiłeś. Niestety ta funkcja jest z jakiegoś niejasnego powodu zaznaczonaprivate
. Na podstawie tej funkcji napisałem następującą funkcję, która znajduje pierwsząScrollView
powyżejView
określonego jako parametr i przewija ją, aby stała się widoczna wScrollView
:źródło
Moje rozwiązanie to:
źródło
Odpowiedzi z mojego praktycznego projektu.
źródło
W moim przypadku tak nie
EditText
jestgoogleMap
. I działa z powodzeniem w ten sposób.źródło
Que: Czy istnieje sposób programowego przewijania widoku przewijania do określonego tekstu edycji?
Odp .: Zagnieżdżony widok przewijania w widoku recyklera wyświetla ostatnią pozycję, dodał dane rekordu.
Czy istnieje sposób programowego przewijania widoku przewijania do określonego tekstu edycji?
źródło
Oto, czego używam:
Pobiera to ilość przewijania niezbędną do wyświetlenia dolnej części widoku, w tym marginesu na dole tego widoku.
źródło
Przewijanie w pionie, dobre dla formularzy. Odpowiedź oparta jest na przewijaniu poziomym Ahmadalibaloch.
źródło
HorizontalScrollView
w tej metodzie?Możesz użyć w
ObjectAnimator
ten sposób:źródło
W oparciu o odpowiedź Sherif, w moim przypadku użycia najlepiej działały następujące. Znaczące zmiany są
getTop()
zamiastgetBottom()
ismoothScrollTo()
zamiastscrollTo()
.źródło
Jeśli scrlMain jest Twoim NestedScrollView, użyj następujących poleceń,
źródło