Czy istnieje sposób na ScrollView
programowe przewijanie do określonej pozycji?
Stworzyłem dynamikę, TableLayout
która jest umieszczona w ScrollView
. Dlatego chcę, aby w przypadku określonej akcji (takiej jak kliknięcie przycisku itp.) Określony wiersz powinien automatycznie przewijać się na najwyższą pozycję.
Czy to możliwe?
java
android
scrollview
android-scrollview
Arun Badole
źródło
źródło
mScrollView.post(new Runnable() { public void run() { mScrollView.fullScroll(View.FOCUS_DOWN); } });
Odpowiedź od Pragna nie zawsze działa, spróbuj tego:
lub
jeśli chcesz przewinąć do początku
źródło
mScrollView.fullScroll(mScrollView.FOCUS_DOWN);
z powodzeniem.mScrollView.smoothScrollTo(0, mScrollView.getBottom());
.post
tutaj?Chciałem, aby scrollView przewijał się bezpośrednio po onCreateView () (nie po np. Kliknięciu przycisku). Aby to działało, potrzebowałem ViewTreeObserver:
Ale pamiętaj, że będzie to wywoływane za każdym razem, gdy coś zostanie ułożone (np. Jeśli ustawisz widok jako niewidoczny lub podobny), więc nie zapomnij usunąć tego nasłuchiwania, jeśli już go nie potrzebujesz:
public void removeGlobalOnLayoutListener (ViewTreeObserver.OnGlobalLayoutListener victim)
na SDK Lvl <16lub
public void removeOnGlobalLayoutListener (ViewTreeObserver.OnGlobalLayoutListener victim)
w SDK Lvl> = 16źródło
Jest tu wiele dobrych odpowiedzi, ale chcę dodać tylko jedną rzecz. Czasami zdarza się, że chcesz przewinąć ScrollView do określonego widoku układu, zamiast pełnego przewijania do góry lub do dołu.
Prosty przykład: w formularzu rejestracyjnym, jeśli użytkownik dotknie przycisku „Zarejestruj się”, gdy tekst edycji formularza nie jest wypełniony, chcesz przewinąć do tego konkretnego tekstu edycji, aby poinformować użytkownika, że musi wypełnić to pole.
W takim przypadku możesz zrobić coś takiego:
lub, jeśli chcesz płynne przewijanie zamiast natychmiastowego przewijania:
Oczywiście zamiast opcji Edytuj tekst można użyć dowolnego typu widoku. Zwróć uwagę, że getBottom () zwraca współrzędne widoku na podstawie jego układu nadrzędnego, więc wszystkie widoki używane wewnątrz ScrollView powinny mieć tylko element nadrzędny (na przykład układ liniowy).
Jeśli masz wielu rodziców wewnątrz elementu podrzędnego ScrollView, jedynym rozwiązaniem, które znalazłem, jest wywołanie requestChildFocus w widoku nadrzędnym:
ale w tym przypadku nie możesz mieć płynnego przewijania.
Mam nadzieję, że ta odpowiedź może pomóc komuś z tym samym problemem.
źródło
Użyj czegoś takiego:
lub
źródło
Spróbuj użyć
scrollTo
metody Więcej informacjiźródło
Jeśli chcesz przewijać od razu, możesz użyć:
Lub jeśli chcesz przewijać płynnie i powoli, aby móc tego użyć:
źródło
catch
blok?** aby przewinąć do żądanej wysokości. Mam dobre rozwiązanie **
źródło
Mam to do pracy, aby przewinąć do dołu ScrollView (z TextView w środku):
(Umieściłem to na metodzie, która aktualizuje TextView)
źródło
Tak, możesz.
Powiedzmy, że masz jeden,
Layout
a wewnątrz niego masz wieleViews
. Więc jeśli chcesz przewinąć do dowolnegoView
programistycznie, musisz napisać następujący fragment kodu:Na przykład:
content_main.xml
MainActivity.java
Jeśli chcesz przewinąć do konkretnego
View
, powiedzmy txtview , w tym przypadku po prostu napisz:Gotowe.
źródło
Uwaga: jeśli jesteś już w wątku, musisz utworzyć nowy wątek postu, lub nie przewijaj nowej długiej wysokości do pełnego końca (dla mnie). Na przykład:
źródło
Dodanie kolejnej odpowiedzi, która nie zawiera współrzędnych.
Spowoduje to skupienie się na żądanym widoku (ale nie na najwyższej pozycji):
child - dziecko tego ViewParent, które chce się skupić. Ten widok będzie zawierał aktywny widok. Niekoniecznie jest to pogląd, który faktycznie się skupia.
skoncentrowany - widok będący potomkiem dziecka, który faktycznie jest skupiony
źródło
po prostu przewiń stronę:
źródło
Każdy publikuje tak skomplikowane odpowiedzi.
Znalazłem łatwą odpowiedź, ładnie przewijając do dołu:
I jeśli to konieczne, możesz umieścić drugą linię kodu powyżej w pliku wykonywalnym:
Znalezienie tego prostego rozwiązania wymagało wielu badań i zabawy. Mam nadzieję, że tobie też pomoże! :)
źródło
Używałem Runnable z sv.fullScroll (View.FOCUS_DOWN); Działa idealnie w przypadku bezpośredniego problemu, ale ta metoda sprawia, że ScrollView przejmuje fokus z całego ekranu, jeśli sprawisz, że automatyczne przewijanie będzie się dziać za każdym razem, żaden EditText nie będzie mógł otrzymywać informacji od użytkownika, moje rozwiązanie używa innego kodu pod runnable:
sv.scrollTo (0, sv.getBottom () + sv.getScrollY ());
robiąc to samo bez utraty koncentracji na ważnych poglądach
Pozdrowienia.
źródło
to działa dla mnie
źródło
źródło
źródło