2011-12-05 17 views
5

Tworzę aplikację, która ma wbudowany widok Webview z innymi elementami, zagnieżdżonymi w ScrollView. Zauważyłem, że w ICS, testowanie na urządzeniu Galaxy Nexus, WebView wydaje się być rozłączny z resztą wyświetlanych elementów, gdy strona jest rzucana, co powoduje, że WebView wydaje się być pływający z powodu kilku wartości ms opóźnienie na rysunku. Tak się nie dzieje w 2.x wersjach Androida (nie testowane na 3.x). Oto wideo z efektem swobodnym: http://www.youtube.com/watch?v=avfBoWmooM4 (widać wyraźnie, jeśli ustawiono tryb pełnoekranowy przy 1080p).Rozłączony rysunek WebView w ICS

Czy ktoś może zasugerować, dlaczego tak się stało lub naprawić?

mam ustawić projekt testowy, poniżej, aby wykazać, że:

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

    } 
} 

Odpowiedz

1

nie wiem jak to naprawić, ale teraz przyczyny. Treść WebView jest renderowana przez android.webkit.WebViewCore w osobnym wątku roboczym. Komunikują się ze sobą. Kiedy WebView potrzebuje ponownego renderowania, wysyła komunikat "proszę wyrenderować" do WebViewCore i gdy WVC jest gotowy, odsyła wynik. Chodzi o to, że ich renderowanie nie jest zsynchronizowane z renderowaniem innych elementów interfejsu użytkownika - tak jak ma to miejsce w osobnym wątku innym niż ui.

Chyba chcieli uniknąć blokowania wątku z wszystkimi nakładami renderingu. To jest bardzo miłe. Ale powoduje inne problemy ... takie jak twoje.