Mam więc fascynujący problem. Pomimo tego, że nie przewijam widoku ręcznie ani programowo, mój WebView jest automatycznie przewijany po załadowaniu danych w nim zawartych.
Mam fragment w przeglądarce. Kiedy pierwszy raz ładuję pager, działa zgodnie z oczekiwaniami i wszystko jest pokazane. Ale kiedy „odwrócę stronę”, dane zostaną załadowane, a WebView wyskakuje na górę strony, ukrywając widoki nad nią, co jest niepożądane.
Czy ktoś wie, jak temu zapobiec?
Mój układ wygląda tak:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/background" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/article_title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginRight="10dp"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="2dp"
android:text="Some Title"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="@color/article_title"
android:textStyle="bold" />
<LinearLayout
android:id="@+id/LL_Seperator"
android:layout_width="fill_parent"
android:layout_height="1dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:background="@color/text"
android:orientation="horizontal" >
</LinearLayout>
<WebView
android:id="@+id/article_content"
android:layout_width="match_parent"
android:layout_marginRight="10dp"
android:layout_marginLeft="10dp"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/article_link"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp"
android:layout_marginTop="5dp"
android:layout_marginRight="10dp"
android:layout_marginLeft="10dp"
android:text="View Full Article"
android:textColor="@color/article_title"
android:textStyle="bold" />
</LinearLayout>
</ScrollView>
Nie skupiam się też na niczym. Domyślnie wydaje się, że po załadowaniu automatycznie przewija się do WebView. Jak temu zapobiec?
Odpowiedzi:
Możesz po prostu dodać to do swojego LinearLayout: android: focusableInTouchMode = "true". Mi to pasuje.
źródło
Miałem ten sam problem, po godzinach wypróbowywania kilku pomysłów, co w końcu zadziałało, to po prostu dodanie
descendantFocusability
atrybutu do ScrollView zawierającego LinearLayout z wartościąblocksDescendants
. W Twoim przypadku:Od tamtej pory problem się nie powtórzył.
źródło
RecyclerView
. Twoje rozwiązanie działa również w tym przypadku :)Powinieneś utworzyć nową klasę rozszerzającą ScrollView, a następnie Override requestChildFocus:
Następnie w układzie XML, używając:
To działa dla mnie. ScrollView nie będzie już automatycznie przewijać do WebView.
źródło
public ExtendedScrollView(Context context) { super(context); } public ExtendedScrollView( Context context, AttributeSet attributeSet) { super(context, attributeSet); } public ExtendedScrollView( Context context, AttributeSet attributeSet, int defStyle) { super(context, attributeSet, defStyle); }
Dodanie tych linii do głównego układu rozwiązuje problem
źródło
Lubię to:
źródło
Prawdopodobnie są ludzie, którzy mają ten sam problem, co ja, więc pomogę.
Próbowałem umieścić android: descendantFocusability = "beforeDescendants" w moim głównym ScrollView w następujący sposób:
i to nie działało, więc musiałem ustawić RelativeLayout jako element nadrzędny ScrollView i umieścić android: descendantFocusability = "beforeDescendants" jako element nadrzędny.
Więc rozwiązałem to, wykonując następujące czynności:
źródło
Musiałem użyć w pełni kwalifikowanej nazwy dla MyScrollView, w przeciwnym razie otrzymałem wyjątek inflate.
źródło