2012-09-24 12 views
5

Co mam:
Teraz mam widok Scroll jako rodzica. Wewnątrz tego widoku przewijania używam WebView, który ładuje adres URL, a następnie wyświetla w nim tekst. Oto mój xml:Scroll Webview wewnątrz zwój Zobacz

<ScrollView 
    android:id="@+id/parentScroll" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_below="@+id/Heading" > 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:padding="5dp" > 

     <WebView 
      android:id="@+id/webView" 
      android:layout_width="match_parent" 
      android:layout_height="300dp" 
      android:background="@drawable/webview" /> 
    </RelativeLayout> 
</ScrollView>  

Czego chcę:
chcę przewinąć Webview wewnątrz niego. Kiedy dotknę webView, niestety wywoływany jest nadrzędny widok przewijania. Muszę również zachować widok przewijania nadrzędnego, ale poza tym chcę przewinąć zawartość WebView w środku, gdy klikam na webView.

Jak mogę to zrobić?

Odpowiedz

4

Zgodnie z dokumentami projektowymi Androida nigdy nie należy umieszczać przewijającego pojemnika w przewijanym pojemniku, jeśli przewija się w tym samym kierunku. To nie ma na celu poradzić sobie z taką rzeczą.

+2

@CaseyB ... ale jej mój warunek. Muszę utrzymywać webView w widoku przewijania. Masz jakiś pomysł na ten temat? – Noman

+2

Obawiam się, że twoje wymagania są złe, nigdy nie powinieneś tego robić. –

+0

@JosephEarl .. ok, a następnie próbuję zmienić projekt. To staje się dla mnie trudne. – Noman

0

Zagnieżdżone widgety przewijane są generalnie odradzane. Jest to mylące doświadczenie użytkownika, ponieważ łatwo jest przewinąć niewłaściwą rzecz. Powiedzmy, że zamierzam przewinąć zewnętrzny obszar przewijania, ale najpierw dotknąłem obszaru wewnętrznego i rzucałem naprawdę mocno. Wtedy ta wewnętrzna przewinie się i będę jak, huh? Dlaczego nie przewijał się?

Nawet jeśli jeden przewija się w poziomie, a drugi w pionie, to urządzenie rozpoznające gesty może pomylić jeden z drugim, aby uzyskać ten sam efekt. Jest to ważny przypadek użycia, ale nadal jest niepewny i unikam go. (IE: Ludzie nie perfekcyjnie przesuwają w pionie i poziomie prawidłowo, zwykle pod kątem).

Chciałbym naciskać, aby zmienić projekt, aby wybić przewijane obszary. Idealnie 1 przewijany przedmiot na stronę. Nawet sam zaproponuj i przekaż projektantowi zarówno doświadczenia, jak i zobacz, który z nich wybierze.

Aby wyrazić, jak to będzie ssać. Spójrz na ten przykład. To nie jest rozwiązanie, ale po prostu pokazać to doświadczenie.

<ScrollView 
    android:id="@+id/parentScroll" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_below="@+id/Heading" > 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" android:orientation="vertical" 
    android:padding="5dp" > 
    <TextView 
     android:id="@+id/topText" 
     android:layout_width="match_parent" 
     android:layout_height="1000dp" 
     android:text="@string/lotsoftext" /> 
    <WebView 
     android:id="@+id/webView" 
     android:layout_width="match_parent" 
     android:layout_height="300dp" 
     android:background="@drawable/webview" /> 
    <TextView 
     android:id="@+id/topText" 
     android:layout_width="match_parent" 
     android:layout_height="1000dp" 
     android:text="@string/lotsoftext" /> 
</RelativeLayout> 

+0

@Jermey Edwards .. dziękuję mojemu przyjacielowi za takie wyjaśnienie, ale niestety jest to moje wymaganie ... muszę umieścić webView wewnątrz widoku przewijania ... tak, że gdy klikam na webView powinien przewijać w pionie i kiedy klikam na zewnątrz webView the whoel screen przewinie się. Czy masz jakiś pomysł na ten temat? – Noman

+0

@Jeremy Edwards przyjrzyj się mojemu rozwiązaniu, proszę podać sposób obejścia tego widoku wewnątrz przewijania [tutaj] (http://stackoverflow.com/a/12963499/1152250) – rus1f1kat0R

6

Tworzenie niestandardowego dotykowy przechwytując Webview

CustomWebview.java

package com.mypackage.common.custom.android.widgets 

public class CustomWebview extends WebView { 

    public CustomWebview(Context context) { 
     super(context); 
    } 

    public CustomWebview(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public CustomWebview(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event){ 
     requestDisallowInterceptTouchEvent(true); 
     return super.onTouchEvent(event); 
    }   
} 

w layout.xml

<com.package.custom.widgets.CustomWebview 
       android:id="@+id/view_extra" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       /> 
2

Miałem ten sam problem. Powinieneś ustawić swoją wysokość WebView równą jej zawartości. do tego to zrobić:
dodać to linie do swojego sposobu onCreate aktywności:

webView.setWebViewClient(new WebViewClient() { 
      @Override 
      public void onPageFinished(WebView view, String url) { 
       webView.loadUrl("javascript:MyApp.resize(document.body.getBoundingClientRect().height)"); 

       super.onPageFinished(view, url); 
      } 
     }); 
webView.addJavascriptInterface(this, "MyApp"); 

i dodać tę metodę do swojej aktywności:

@JavascriptInterface 
    public void resize(final float height) { 
     MainActivity.this.runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       webView.setLayoutParams(new LinearLayout.LayoutParams(getResources().getDisplayMetrics().widthPixels, (int) (height * getResources().getDisplayMetrics().density))); 
      } 
     }); 
    } 
Powiązane problemy