Veriler yüklendikten sonra kaydırma görünümünün bir web görünümüne kayması nasıl engellenir?


107

Bu yüzden büyüleyici bir sorunum var. Görünümümü manuel olarak veya programlı olarak kaydırmadığım gerçeğine rağmen, Web Görünümüm içindeki veriler yüklendikten sonra otomatik olarak kaydırılıyor.

Görüntüleyicide bir parçam var. Çağrı cihazını ilk yüklediğimde, beklendiği gibi çalışıyor ve her şey gösteriliyor. Ancak bir kez "sayfayı çevirdiğimde" veriler yüklenir ve Web Görünümü sayfanın üst kısmına açılır ve bu istenmeyen bir durumdur.

Bunun olmasını nasıl önleyeceğini bilen var mı?

Düzenim şöyle görünüyor:

<?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>

Ayrıca hiçbir şeye odaklanmıyorum. Varsayılan olarak, yüklendikten sonra otomatik olarak Web Görünümü'ne kayıyor gibi görünüyor. Bunu nasıl önleyebilirim?


Bir Web Görünümü kaydırılabilir olduğundan tam olarak neden ScrollView'a ihtiyacınız var?
znat

Bazı yönleri HTML olarak oluşturmak yerine web görünümünün dışında tutmak için. Hız ve kalite için.
Navarr

1
mjp66 en iyi cevaba sahip - belki de cevabını kabul etmelisiniz
AndrewS

Yanıtlar:


43

Bunu LinearLayout'a ekleyebilirsiniz: android: focusableInTouchMode = "true". Benim için çalışıyor.

 <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:focusableInTouchMode="true"
    android:orientation="vertical" >

4
Yan etkisi olmadan çalışır!
Vaibhav Jani

267

Birkaç fikir denedikten sonra saatlerce çalıştıktan sonra aynı problemi yaşadım, nihayet benim için işe descendantFocusabilityyarayan şey, ScrollView'un değeriyle birlikte LinearLayout'u içeren özelliği eklemek oldu blocksDescendants. Senin durumunda:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:descendantFocusability="blocksDescendants" >

O zamandan beri sorun tekrarlanmadı.


3
Bunun, bu kontrollerin erişilebilirliği üzerinde herhangi bir olumsuz etkisi var mı?
Cory Trese

34
EditText gibi alt görünümler varsa, bu yöntemin bunların düzenlenemez hale gelmesine neden olacağını unutmayın.
djhworld

2
ScrollView Webview otomatik kaydırma sözcüklerini aradığınızda bu soru / yanıt gelmez ve olmalıdır. Belki bu yorum yardımcı olur! WebViewFragment kullanımıyla aynı sorunu yaşadım ve kendi sorumu gönderene kadar (şimdi silindi) çok fazla aramadan sonra bile bu soruyu bulamadım.
Colin M.

1
Bir Xamarin.Android projesi üzerinde çalışırken, indirilen görüntülerle eşzamansız olarak doldurulan birden çok ızgara görünümüne sahip bir kaydırma görünümünde otomatik kaydırma sorunu vardı. Bu çözüm o kadar mükemmel çalıştı ki, ilk bakışta inanmakta güçlük çektim ve tekrar denemek zorunda kaldım.
YumeYume

1
Aynı sorun içindeki Reklamlar için RecyclerViewde geçerlidir. Çözümünüz bu durumda da işe yarıyor :)
Minas Mina

26

ScrollView 'ı genişletmeli, ardından requestChildFocus'u Geçersiz Kıl yeni bir sınıf oluşturmalısınız:

public class MyScrollView extends ScrollView {

    @Override 
    public void requestChildFocus(View child, View focused) { 
        if (focused instanceof WebView ) 
           return;
        super.requestChildFocus(child, focused);
    }
}

Ardından xml düzeninizde şunları kullanarak:

<MyScrollView 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@color/background" >

Bu benim için çalışıyor. ScrollView artık Web Görünümüne otomatik olarak kaydırılmayacaktır.


5
Ayrıca kuruculara ihtiyaç var: 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); }
Erik B

5

Bu satırı ana düzene eklemek sorunu çözer

android:descendantFocusability="blocksDescendants"

4

Bunun gibi:

<com.ya.test.view.MyScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:descendantFocusability="beforeDescendants"
        android:focusable="true"
        android:focusableInTouchMode="true" >

4

Muhtemelen benim yaşadığım sorunu yaşayan insanlar var, bu yüzden yardım edeceğim.

Android: descendantFocusability = "beforeDescendants" öğesini ana ScrollView'uma aşağıdaki gibi koymaya çalışıyordum :

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:descendantFocusability="beforeDescendants">
    /*my linearlayout or whatever to hold the views */

ve çalışmıyordu, bu yüzden ScrollView'ın üst öğesi olan bir RelativeLayout yapmam ve android: descendantFocusability = "beforeDescendants" öğesini ebeveyn alanına da yerleştirmem gerekiyordu.

Bu yüzden aşağıdakileri yaparak çözdüm:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:descendantFocusability="blocksDescendants">

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent">
/*my linearlayout or whatever to hold the views */

-2

MyScrollView için tam nitelikli adı kullanmak zorunda kaldım, aksi takdirde bir şişirme istisnası aldım.

<com.mypackagename.MyScrollView 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@color/background" >
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.