2011-12-05 4 views
5

Я создаю приложение, которое имеет встроенный Webview с другими элементами, вложенными в ScrollView. Я заметил, что в ICS, тестировании на устройстве Galaxy Nexus, WebView, похоже, не разделен с остальными отображаемыми элементами, когда страница удалена, что приводит к тому, что WebView выглядит плавающим из-за нескольких мс отставание от рисования. Этого не происходит в версиях Android 2.x (не тестировалось на 3.x). Вот видео с плавающим эффектом http://www.youtube.com/watch?v=avfBoWmooM4 (вы можете четко видеть, если вы установили полноэкранный режим на 1080p)Несвязанный чертеж WebView в ICS

Может кто-нибудь предположить, почему это может произойти, или исправить?

я установки тестового проекта, ниже, чтобы продемонстрировать:

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

    } 
} 

ответ

1

Я не знаю, как это исправить, но я теперь причину. Содержимое WebView визуализируется android.webkit.WebViewCore в отдельном рабочем потоке. Они общаются друг с другом. Когда WebView нуждается в повторной визуализации, он отправляет сообщение «пожалуйста визуализировать» в WebViewCore и когда WVC готов, он отправляет результат. Дело в том, что их рендеринг не синхронизирован с рендерингом других элементов пользовательского интерфейса - как это делается на отдельном потоке, отличном от ui.

Я думаю, они хотели избежать блокировки ui-нитки со всем усилием рендеринга. Это очень добро. Но это вызывает другие проблемы ... как ваши.