2013-05-08 2 views
2

Я хочу:WebView в ScrollView предотвращает все прокрутке

  1. положил фрагмент на экране, который содержит:
    1. WebView
    2. ... расширен до полной высоты
    3. встроенный в макет фиксированного размера выше и ниже
    4. прокрутите макет (то есть всю вещь, включая веб-просмотр полной высоты)

Это кажется невозможным. Теперь я прочитал 10 + разных вопросов/ответов на SO, все они охватывают различные критические ошибки в Android WebView, но ни одна из них не охватывает эту ситуацию.

кажется (от чтения других вопросов, и после ссылки на текущие незакрепленные ошибки на андроид сайта), что: высота

  1. Webview всегда была неправильно (нефиксированной Android 2 - 4: например, высота никогда уменьшается)
  2. Прокрутка веб-страниц, разрывы, разрывы, разрывы по-новому в последующих версиях Android (например: некоторые выпуски ScrollView получает контроль, другие WebView получает контроль, другие они «сражаются», а вы заикаетесь и т. д.)
  3. Вы должны использовать некоторые причудливые настройки для ScrollView, чтобы заставить его делать то, что он должен делать из-за-t он-бокс. например «Андроид: fillViewport =» истина»(? Да не то, что именно то, что„layout_height = fill_parent“должен делать?)

Кто-нибудь есть рабочий код для достижения этой относительно простой и общей настройки я? (за исключением, конечно, «выбросьте свое приложение для Android и напишите webapp». Это может сработать, но было бы нереально, к сожалению)

Для справки (и для кого-либо еще попробуйте что-то подобное) вот мой макет, который заполняет экран, но вся прокрутка отключена, и я не вижу никаких причин:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:fillViewport="true" 
> 

    <RelativeLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"> 

     <!-- page header --> 

     <RelativeLayout 
      android:id="@+id/fragment_detailspage_titletext_layout" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:clickable="true" 
      android:visibility="visible" > 

      <include 
       android:id="@+id/fragment_detailspage_titletext_include" 
       layout="@layout/include_textheader" 
       android:visibility="visible" /> 
     </RelativeLayout> 

     <RelativeLayout 
      android:id="@+id/fragment_detailspage_header_layout" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_below="@id/fragment_detailspage_titletext_layout" 
      android:clickable="true" 
      android:visibility="visible" > 

      <!-- logo image --> 

      <include 
       android:id="@+id/fragment_detailspage_logoimageheader_include" 
       layout="@layout/include_logoimageheader" /> 
     </RelativeLayout> 

     <!-- page footer --> 

     <RelativeLayout 
      android:id="@+id/fragment_detailspage_footer_layout" 
      android:layout_width="fill_parent" 
      android:layout_height="64dp" 
      android:layout_alignParentBottom="true" 
      android:background="@drawable/generic_button_not_pressed" 
      android:clickable="true" 
      android:visibility="visible" > 

      <!-- 1 buttons --> 

      <include 
       android:id="@+id/fragment_detailspage_bottombuttonstrip1_include" 
       android:layout_width="wrap_content" 
       android:layout_height="64dp" 
       android:layout_centerHorizontal="true" 
       layout="@layout/include_bottombuttonstrip1" /> 
     </RelativeLayout> 

     <!-- page content --> 

     <WebView 
      android:id="@+id/fragment_detailspage_content_web" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_above="@id/fragment_detailspage_footer_layout" 
      android:layout_below="@id/fragment_detailspage_header_layout" 
      android:visibility="visible" /> 

    </RelativeLayout> 

</ScrollView> 
+1

Вы посмотрели сообщение? http://stackoverflow.com/a/13353874/801437 –

+0

«Теперь я прочитал 10 + разных вопросов/ответов на SO, все они охватывают различные критические ошибки в Android WebView, но ни одна из них не покрывает эту ситуацию» - Я почти уверен, что ответил на многие вопросы Android, указывая, что размещение прокручиваемого контента в 'ScrollView' редко работает хорошо. – CommonsWare

+1

+1 на точке CommonsWare, не помещайте прокручиваемые виды в ScrollView. Ваш макет выглядит так, как будто он немного ... перепроектирован. Вы могли бы прикрепить изображение к своему Q того, на что вы хотите, чтобы ваш макет выглядел, а может быть, мы могли бы помочь вам упростить ваш XML и объяснить, почему вам не нужен WebView в ScrollView. – Blundell

ответ

5

Извините за изображение ниже, но я представляю его каждый раз, когда кто-то хочет поставить прокручиваемый вид внутри прокручиваемого вида.

enter image description here

Пожалуйста, попробуйте использовать CustomScrollView и переопределить onInterceptTouchEvent:

public class CustomScrollView extends ScrollView { 

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

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

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

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent e) { 
     super.onInterceptTouchEvent(e); 
     return false; 
    } 


} 
+0

+1 самым забавным изображением, которое я видел в stackoverflow. – ademar111190

1

почти никогда приложение я использую имеет некоторую форму Web/Scroll/настраиваемый заголовок/колонтитул комбо

Имейте в виду, что «Интернет» может быть TextView вместо WebView, помните, что «Прокрутка» может быть ListView вместо ScrollView, и имейте в виду, что «пользовательская комбинация заголовка/нижнего колонтитула» может быть реализована в HTML внутри WebView. Любой из них позволит вам выбраться из сценария WebView -in-a- ScrollView.Немногие приложения будут использовать ScrollView, а меньшее количество будет делать WebView в ScrollView.

Есть, конечно, более сложные возможности. Например, просмотр разговора Gmail - это WebView с другими вещами, расположенными поверх него по оси Z, с использованием FrameLayout, где они, по-видимому, отслеживают события прокрутки WebView, чтобы изменить положение другого материала, расположенного поверх него (например, закрепление заголовок отправителя и ответчика, когда вы прокручиваете его, чтобы получить его вверху).

Вы можете использовать uiautomatorviewer, чтобы узнать, как это реализовано, если у вас есть устройство Android 4.1+. Вот как я вижу, как Gmail снимает это. Вы не можете получить все детали, но это дает вам подсказки.

Смежные вопросы