2011-12-05 21 views
5

Estoy haciendo una aplicación que tiene una vista web en línea con otros elementos, anidados en un ScrollView. Me di cuenta de que en ICS, que se prueba en un dispositivo Galaxy Nexus, el WebView parece estar separado del resto de los elementos que se muestran cuando se lanza la página, lo que hace que el WebView parezca estar flotando debido a un par de valores de ms retraso en el dibujo. Esto no ocurre en las versiones 2.x de Android (no probadas en 3.x). Aquí hay un video del efecto flotante http://www.youtube.com/watch?v=avfBoWmooM4 (se puede ver claramente si se establece en pantalla completa a 1080p)Dibujo WebView incrustado en ICS

¿Alguien puede sugerir por qué esto puede pasar, o una solución?

he configurar un proyecto de prueba, a continuación, para demostrar:

package com.martynhaigh.floating_web_view; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.webkit.WebView; 
import android.widget.FrameLayout; 
import android.widget.LinearLayout; 
import android.widget.ScrollView; 
import android.widget.TextView; 

public class FloatingWebViewTestActivity extends FragmentActivity { 
    public final int viewId = 0x12345678; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); 
     FrameLayout frame = new FrameLayout(this); 
     frame.setId(viewId); 
     setContentView(frame, lp); 

     FloatingWebViewICSFragment fragment = new FloatingWebViewICSFragment(); 
     getSupportFragmentManager().beginTransaction().add(viewId, fragment).commit(); 
    } 

    public static class FloatingWebViewICSFragment extends Fragment { 

     private final String htmlBody = "<html><body><p style=\"font-size:1.5em\">This is a test document. This is a test document. This is a test document. This is a test document. This is a test document. This is a test document. This is a test document. This is a test document. This is a test document. This is a test document. This is a test document. This is a test document. This is a test document. This is a test document. This is a test document. This is a test document. This is a test document. This is a test document. This is a test document. This is a test document. This is a test document. This is a test document. This is a test document. This is a test document. This is a test document. This is a test document. This is a test document. This is a test document. </body></html>"; 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

      TextView textView = new TextView(getActivity().getApplicationContext()); 
      textView.setText("Test Activity"); 

      WebView webView = new WebView(getActivity().getApplicationContext()); 
      webView.loadDataWithBaseURL("file:///android_asset/", htmlBody, "text/html", "UTF-8", "about:blank"); 
      webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); 
      webView.setScrollContainer(false); 

      TextView textView2 = new TextView(getActivity().getApplicationContext()); 
      textView2.setText("Test Activity"); 

      FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT); 

      LinearLayout layout = new LinearLayout(getActivity().getApplicationContext()); 
      layout.setLayoutParams(lp); 
      layout.setOrientation(LinearLayout.VERTICAL); 

      layout.addView(textView); 
      layout.addView(webView); 
      layout.addView(textView2); 

      ScrollView scrollView = new ScrollView(getActivity().getApplicationContext()); 
      scrollView.setLayoutParams(lp); 
      scrollView.addView(layout); 

      return scrollView; 
     } 

    } 
} 

Respuesta

1

no sé cómo solucionarlo pero ahora la razón. El contenido de WebView se representa con android.webkit.WebViewCore en su cadena de trabajo separada. Se están comunicando entre ellos. Cuando WebView necesita una repetición, envía un mensaje "renderizar" a WebViewCore y cuando WVC está listo, envía el resultado. El punto es que su representación no está sincronizada con la representación de otros elementos de la interfaz de usuario, ya que se realiza en un subproceso distinto de la interfaz de usuario.

Supongo que querían evitar el bloqueo de la interfaz de usuario con todo el esfuerzo de renderizado. Eso es muy amable. Pero causa otros problemas ... como el tuyo.