Макет вкладки SwipeRefreshLayout. Веб-просмотр не может прокручиваться вверх

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

Макет

<android.support.v4.widget.SwipeRefreshLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/swipe_container"
    android:layout_width="match_parent"
    android:layout_height="20px"
    android:layout_weight="1"
    android:nestedScrollingEnabled="true">


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Splash$PlaceholderFragment">

    <TextView
        android:id="@+id/section_label"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <WebView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/webView"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true"
        android:overScrollMode="ifContentScrolls"
        android:nestedScrollingEnabled="false"/>

    <ProgressBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/progressBar"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true" />

    <ListView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/listView"
        android:layout_centerVertical="false"
        android:layout_centerHorizontal="true"
        android:visibility="visible" />

</RelativeLayout>
</android.support.v4.widget.SwipeRefreshLayout>

SwipeRefreshLayout используется внутри фрагмента для моего макета с вкладками.

        swipeLayout = (SwipeRefreshLayout) rootView.findViewById(R.id.swipe_container);

        swipeLayout.setColorScheme(android.R.color.holo_blue_bright,
                android.R.color.holo_green_light,
                android.R.color.holo_orange_light,
                android.R.color.holo_red_light);
        swipeLayout.setOnRefreshListener( new SwipeRefreshLayout.OnRefreshListener() {

                @Override public void onRefresh() {
                    if(getArguments().getInt(ARG_SECTION_NUMBER) == 4 ) {
                        stringArrayList.clear();
                        new updatetheQueue().execute(ctx);
                    }
                    else {
                        swipeLayout.setRefreshing(false);
                    }
                }});

person Dandrews    schedule 24.07.2014    source источник


Ответы (5)


Вы можете использовать OnScrollChangedListener, чтобы отключить SwipeRefreshLayout, когда WebView не прокручивается вверх.

// Only enable swipe to refresh if the `WebView` is scrolled to the top.
webView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
  @Override
  public void onScrollChanged() {
     if (webView.getScrollY() == 0) {
         swipeRefreshLayout.setEnabled(true);
      } else {
         swipeRefreshLayout.setEnabled(false);
      }
  }
});
person Soren Stoutner    schedule 15.10.2015
comment
Работает как шарм - person MyMomSaysIamSpecial; 22.01.2018
comment
Нестатический метод setEnabled (boolean) - person bhupathi turaga; 02.08.2018
comment
@bhupathi-turaga, этот метод, как и многие другие в Java, нельзя вызывать из статического контекста. Вам потребуется реорганизовать код, чтобы переместить команду в нестатический контекст, который имеет прямой доступ к файлу SwipeRefreshLayout. - person Soren Stoutner; 05.08.2018
comment
как сделать динамический - person bhupathi turaga; 06.08.2018
comment
То, как вы решаете свою проблему, во многом зависит от того, как именно выглядит ваш код. Вы должны задать новый вопрос с фрагментами соответствующих разделов вашего кода. - person Soren Stoutner; 07.08.2018

Заставить эту работу было очень сложно. Однако есть довольно простая модификация, которую можно внести в макет XML, чтобы обойти это. Это означает, что я не могу обновлять веб-просмотры при пролистывании, но это нормально.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Splash$PlaceholderFragment">

<TextView
    android:id="@+id/section_label"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

<WebView
    android:id="@+id/webView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_alignParentStart="true"
    android:layout_alignParentTop="true"
    android:overScrollMode="ifContentScrolls" />

<ProgressBar
    android:id="@+id/progressBar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true" />

<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/swipe_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".Splash$PlaceholderFragment">

        <ListView
            android:id="@+id/listView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="false"
            android:visibility="visible" />
    </RelativeLayout>
</android.support.v4.widget.SwipeRefreshLayout>

person Dandrews    schedule 24.07.2014

вы можете расширить класс SwipeRefreshLayout и переопределить canChildScrollUp, чтобы сидеть scro

@Override
public boolean canChildScrollUp() {
    // TODO Auto-generated method stub


        return true; // if you want it to scroll up 

        // check if child Get To Top 

        //return false // if you want it to execute swipe down to refresh listener

}
person Yousef Zakher    schedule 27.12.2014

Если вы используете ViewPager, а вкладки являются фрагментами, вы можете исправить свой WebViewFragment с помощью этого фрагмента кода:

private ViewTreeObserver.OnScrollChangedListener mOnScrollChangedListener;

@Override 
public void onStart() { 
    super.onStart(); 

    swipeLayout.getViewTreeObserver().addOnScrollChangedListener(mOnScrollChangedListener =
            new ViewTreeObserver.OnScrollChangedListener() {
                @Override 
                public void onScrollChanged() { 
                    if (mWebView.getScrollY() == 0) 
                        swipeLayout.setEnabled(true); 
                    else 
                        swipeLayout.setEnabled(false); 

                } 
            }); 
} 

@Override 
public void onStop() { 
    swipeLayout.getViewTreeObserver().removeOnScrollChangedListener(mOnScrollChangedListener);
    super.onStop(); 
}

Дополнительные сведения см. в Android — SwipeRefreshLayout с пустым текстовым представлением.

person vizZ    schedule 13.01.2015

вот как я решаю проблему, надеюсь, это поможет:

mWebView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
            @Override
            public void onScrollChanged() {
                if(mWebView.getScrollY() == 0){
                    mSwipeRefreshLayout.setEnabled(true);
                }else{
                    mSwipeRefreshLayout.setEnabled(false);
                }
            }
        });
person Cevin Ways    schedule 28.04.2019
comment
Он отлично работает для одиночного просмотра, но если на веб-сайте есть прокрутка всплывающих окон, то он не работает. - person Md Imran Choudhury; 22.07.2020