2012-09-24 15 views
5

Lo que tengo:
Ahora tengo una vista de desplazamiento como elemento primario. Dentro de esta vista de desplazamiento, estoy usando un WebView que carga una URL y luego muestra texto en ella. Aquí es mi xml:Desplazar vista web dentro de una vista de desplazamiento

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

Lo que quiero:
quiero para desplazarse web View dentro de él. Cuando toco la vista web, desafortunadamente se llama a la vista de desplazamiento principal. Tengo que mantener la vista de desplazamiento de los padres también, pero además de esto quiero desplazar el contenido de WebView dentro de él cuando toco en webView.

¿Cómo puedo hacer esto?

Respuesta

4

De acuerdo con los documentos de diseño de Android, nunca debe colocar un contenedor desplazable dentro de un contenedor de desplazamiento si se desplazan en la misma dirección. No está destinado a manejar tal cosa.

+2

@CaseyB ... Pero es mi requisito. Tengo que mantener webView en una vista de desplazamiento. ¿Tengo alguna idea sobre esto? – Noman

+2

Entonces me temo que sus requisitos son incorrectos, nunca debería necesitar hacer esto. –

+0

@JosephEarl ... bien, entonces trato de cambiar el diseño. Me está poniendo difícil ... – Noman

0

Se desaconsejan los widgets desplazables anidados. Es una experiencia de usuario confusa porque es fácil desplazarse por el lado equivocado. Digamos que tengo la intención de desplazarme por la región de desplazamiento exterior, pero primero toqué la región interior y me estremecí. Entonces el interno se desplazará y yo seré como eh? ¿Por qué no se desplazó?

Incluso si uno se desplaza horizontalmente y el otro verticalmente, los reconocedores de gestos pueden confundir uno con otro para que obtenga el mismo efecto. Es un caso de uso válido pero todavía es dudoso y lo evitaría. (IE: los seres humanos no deslizan perfectamente vertical y horizontalmente, es generalmente con un ángulo.)

Me gustaría cambiar el diseño para romper las áreas desplazables. Lo ideal es 1 elemento desplazable por página. Incluso proponga uno y proporcione al diseñador ambas experiencias y vea cuál elige.

Para expresar cómo esto apestará. Mira este ejemplo. Esta no es una solución sino solo mostrar la experiencia.

<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 ... Gracias amigo por tal explicación, pero desafortunadamente es mi requisito ... tengo que poner webView dentro de la vista de desplazamiento ... para que cuando haga clic en webView, se desplace verticalmente y cuando haga clic fuera de webView the whoel screen se desplazará. ¿Tienes alguna idea al respecto? – Noman

+0

@Jeremy Edwards mira mi solución, por favor, proporciona la solución para colocar webview dentro de una vista de desplazamiento [aquí] (http://stackoverflow.com/a/12963499/1152250) – rus1f1kat0R

6

Crea una alfombrilla táctil Interceptar 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); 
    }   
} 

en layout.xml

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

Tuve el mismo problema. Debe establecer su Altura de vista web igual a su contenido. para este hacer esto:
añadir estas líneas a su método onCreate de la Actividad:

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"); 

y añadir este método para su actividad:

@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))); 
      } 
     }); 
    } 
Cuestiones relacionadas