Chciałbym, aby ScrollView zaczął się od samego początku. Jakieś metody?
android
android-scrollview
Noah Seidman
źródło
źródło
Odpowiedzi:
scroll.fullScroll(View.FOCUS_DOWN)
powinien również działać.Umieść to w
scroll.Post(Runnable run)
Kod Kotlin
źródło
powinieneś uruchomić kod w scroll.post w następujący sposób:
źródło
scroll.scrollTo(0, scroll.getHeight());
aby przejść do dołu lubscroll.smoothScrollTo(0, scroll.getHeight());
płynniejszego przewijaniascrollView.post { scrollView.fullScroll(View.FOCUS_DOWN) }
scroll.fullScroll(View.FOCUS_DOWN)
doprowadzi do zmiany ostrości. Spowoduje to dziwne zachowanie, gdy istnieje więcej niż jeden widok z możliwością ustawiania ostrości, np. Dwa EditText. Jest inny sposób na to pytanie.To działa dobrze.
Rozszerzenie Kotlin
źródło
Czasami scrollView.post nie działa
ALE jeśli użyjesz scrollView.postDelayed, to na pewno zadziała
źródło
To, co działało dla mnie najlepiej, to
źródło
Zwiększam do perfekcji.
Uwaga
Ta odpowiedź jest obejściem dla naprawdę starych wersji Androida. Dzisiaj
postDelayed
nie ma już tego błędu i powinieneś go użyć.źródło
postDelayed
:)próbowałem tego z sukcesem.
źródło
Gdy widok nie jest jeszcze załadowany, nie można przewijać. Możesz to zrobić „później” za pomocą połączenia pocztowego lub snu, jak wyżej, ale nie jest to zbyt eleganckie.
Lepiej zaplanować zwój i zrobić to na następnej funkcji onLayout (). Przykładowy kod tutaj:
https://stackoverflow.com/a/10209457/1310343
źródło
Jedną rzeczą do rozważenia jest to, czego NIE należy ustawiać. Upewnij się, że formanty podrzędne, zwłaszcza formanty EditText, nie mają ustawionej właściwości RequestFocus. Może to być jedna z ostatnich interpretowanych właściwości układu i zastąpi ustawienia grawitacji na jego rodzicach (układzie lub ScrollView).
źródło
Oto kilka innych sposobów przewijania na dół
Za pomocą
Jeśli przewijasz widok już ułożony
Jeśli widok przewijania nie jest zakończony (np. Przewijasz w dół w
onCreate
metodzie działania ...)źródło
Nie do końca odpowiedź na pytanie, ale musiałem przewinąć w dół, gdy tylko tekst EditText się skupi. Jednak zaakceptowana odpowiedź sprawiłaby, że ET również natychmiast straciłoby koncentrację (zakładam, że do ScrollView).
Moje obejście było następujące:
źródło
Odkryłem, że dwukrotne wywołanie funkcji fullScroll:
Może to mieć coś wspólnego z aktywacją metody post () zaraz po wykonaniu pierwszego (nieudanego) przewijania. Myślę, że takie zachowanie występuje po każdym poprzednim wywołaniu metody myScrollView, więc możesz spróbować zastąpić pierwszą metodę fullScroll () inną, która może być dla ciebie odpowiednia.
źródło
Jest jeszcze jeden fajny sposób na zrobienie tego z karlinami Kotlin. Zaletą użycia coroutine w przeciwieństwie do Handlera z runnable (post / postDelayed) jest to, że nie uruchamia on drogiego wątku w celu wykonania akcji opóźnionej.
Ważne jest, aby określić HandlerContext coroutine jako interfejs użytkownika, w przeciwnym razie opóźnione działanie może nie zostać wywołane z wątku interfejsu użytkownika.
źródło
W takim przypadku używano tylko scroll.scrollTo (0, sc.getBottom ()) nie działa, użyj go za pomocą scroll.post
Przykład:
źródło
Jednym z możliwych powodów, dla których
scroll.fullScroll(View.FOCUS_DOWN)
może nie działać, nawet gdy jest opakowany,.post()
jest brak widoku. W takim przypadku lepszym rozwiązaniem może być View.doOnLayout () :Lub coś bardziej opracowanego dla odważnych dusz: https://chris.banes.dev/2019/12/03/suspending-views/
źródło