在 webview 上添加 pull to refresh 以进行刷新
Posted
技术标签:
【中文标题】在 webview 上添加 pull to refresh 以进行刷新【英文标题】:Adding pull to refresh on webview for refreshing 【发布时间】:2016-10-13 00:19:54 【问题描述】:我将在我的 webview 上添加 pull 以刷新,以便刷新我的 webview。我已经看到此页面上的所有问题,但我找不到添加拉动刷新的好方法......
Mainactivity.java
package com.vvhvb.hesselfeenstra.vvheerenveenseboys;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class MainActivity extends AppCompatActivity
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String url ="http://heerenveenseboys.nl/";
WebView view=(WebView) this.findViewById(R.id.webView);
view.getSettings().setjavascriptEnabled(true);
view.getSettings().setBuiltInZoomControls(true);
view.getSettings().setDisplayZoomControls(false);
view.setWebViewClient(new WebViewClient());
view.loadUrl(url);
content_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="com.vvhvb.hesselfeenstra.vvheerenveenseboys.MainActivity"
tools:showIn="@layout/activity_main">
<WebView
android:layout_
android:layout_
android:id="@+id/webView"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
</RelativeLayout>
我希望任何人都可以帮助我并为我解决这个问题。
【问题讨论】:
【参考方案1】:你可以像这样将 webview 包裹在 Swipe 刷新布局中
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="com.vvhvb.hesselfeenstra.vvheerenveenseboys.MainActivity"
tools:showIn="@layout/activity_main">
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swipeContainer"
android:layout_
android:layout_
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<android.support.v4.widget.NestedScrollView
android:layout_
android:layout_>
<WebView
android:id="@+id/webView"
android:layout_
android:layout_
android:layout_alignParentBottom="true"
android:layout_alignParentEnd="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true" />
</android.support.v4.widget.NestedScrollView>
</android.support.v4.widget.SwipeRefreshLayout>
</RelativeLayout>
在java中
package com.vvhvb.hesselfeenstra.vvheerenveenseboys;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class MainActivity extends AppCompatActivity
WebView view;
SwipeRefreshLayout mySwipeRefreshLayout;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mySwipeRefreshLayout = (SwipeRefreshLayout)this.findViewById(R.id.swipeContainer);
String url ="http://heerenveenseboys.nl/";
view=(WebView) this.findViewById(R.id.webView);
view.getSettings().setJavaScriptEnabled(true);
view.getSettings().setBuiltInZoomControls(true);
view.getSettings().setDisplayZoomControls(false);
view.setWebViewClient(new WebViewClient());
view.loadUrl(url);
mySwipeRefreshLayout.setOnRefreshListener(
new SwipeRefreshLayout.OnRefreshListener()
@Override
public void onRefresh()
view.reload();
);
【讨论】:
当我粘贴 webview.reload() 时,该行出现错误。 您已经在 onCreate()Webview webview = (WebView)findViewById(R.id.web_view)
中定义了 webview,然后在 onCreate 中调用 webview.loadUrl("your url")
来初始加载 wbeview。然后在监听器中调用webview.reload()
。
嗯..在 reload() 函数后尝试 mySwipeRefreshLayout.setRefreshing(false);
内 onRefresh
。
成功了 谢谢你!但是你应该这样做 onPageFinished swRefreshLayout.setRefreshing(false);
这对我根本不起作用,它显示纯白色的空白屏幕。因为nestedscrollview 的行为很粗鲁【参考方案2】:
我认为最好的解决方案是使用SwipeRefreshLayout
,但其中没有NestedScrollView
,就像jitinsharma 描述的那样,因为这个可能的问题:webview height grows indefinitely inside a nestedScrollView。但是vizZ 描述的滚动问题还有另一种解决方案,实施ViewTreeObserver.OnScrollChangedListener
。所以工作解决方案应该是这样的:
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swipeContainer"
android:layout_
android:layout_
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<RelativeLayout
android:id="@+id/nonVideoLayout"
android:layout_
android:layout_
android:windowSoftInputMode="adjustResize">
<WebView
android:id="@+id/main_web_view"
android:layout_
android:layout_
android:layout_marginTop="5dp"
android:windowSoftInputMode="adjustResize"
app:layout_constraintDimensionRatio="1" />
</RelativeLayout>
</android.support.v4.widget.SwipeRefreshLayout>
活动参数:
private WebView mWebView;
private SwipeRefreshLayout mySwipeRefreshLayout;
private ViewTreeObserver.OnScrollChangedListener mOnScrollChangedListener;
关于活动onCreate
:
mWebView = (WebView) findViewById(R.id.main_web_view);
mySwipeRefreshLayout = (SwipeRefreshLayout)this.findViewById(R.id.swipeContainer);
mySwipeRefreshLayout.setOnRefreshListener(
new SwipeRefreshLayout.OnRefreshListener()
@Override
public void onRefresh()
mWebView.reload();
);
活动的实现:implements AdvancedWebView.Listener
关于活动onStop
:
mySwipeRefreshLayout.getViewTreeObserver().removeOnScrollChangedListener(mOnScrollChangedListener);
和活动onStart
:
mySwipeRefreshLayout.getViewTreeObserver().addOnScrollChangedListener(mOnScrollChangedListener =
new ViewTreeObserver.OnScrollChangedListener()
@Override
public void onScrollChanged()
if (mWebView.getScrollY() == 0)
mySwipeRefreshLayout.setEnabled(true);
else
mySwipeRefreshLayout.setEnabled(false);
);
【讨论】:
是的,只有这个解决方案才能提供流畅的加载,android.support.v4.widget.NestedScrollView 是在加载时包装 webview 并且加载并不漂亮。【参考方案3】:activity_main.xml
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swipeContainer"
android:layout_
android:layout_
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<WebView
android:id="@+id/webview"
android:layout_
android:layout_ app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="0dp"
android:layout_marginLeft="0dp"
android:layout_marginStart="0dp"
android:layout_marginEnd="0dp"
android:layout_marginRight="0dp"
android:layout_marginBottom="0dp"
app:layout_constraintBottom_toBottomOf="parent"/>
</android.support.v4.widget.SwipeRefreshLayout>
对于 Kotllin:
MainActivity.kt
var mySwipeRefreshLayout: SwipeRefreshLayout? = null
var myWebView: WebView? = null
mySwipeRefreshLayout = findViewById<SwipeRefreshLayout>(R.id.swipeContainer)
mySwipeRefreshLayout?.setOnRefreshListener
Log.i("on refresh", "onRefresh called from SwipeRefreshLayout")
// This method performs the actual data-refresh operation.
// The method calls setRefreshing(false) when it's finished.
myWebView?.reload();
myWebView!!.webViewClient = object : WebViewClient()
override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean
view?.loadUrl("http://www.google.com")
return false;
override fun onPageFinished(view: WebView?, url: String?)
mySwipeRefreshLayout?.isRefreshing = false
【讨论】:
【参考方案4】:如果你只想拉刷新试试这个
ll = (LinearLayout)findViewById(R.id.CategorySelect_lLayout_noID);
ll.setOnTouchListener(new OnTouchListener()
public boolean onTouch(View v, MotionEvent event)
if(event.getAction() == MotionEvent.ACTION_DOWN)
Toast.makeText(CategorySelect.this, "action DOWN called", Toast.LENGTH_SHORT).show();
return true;
return false;
);
return true;
或者如果你想要一个图标或类似 chrome 的东西
https://github.com/liaohuqiu/android-Ultra-Pull-To-Refresh
【讨论】:
我可以用那个刷新我的网页视图吗? 是的,你可以在 MotionEvent.ACTION _DOWN 之后再次输入 loadURL(https://developer.android.com/training/swipe/add-swipe-interface.html
您可以使用 Swipe-to-Refresh 布局,它易于使用并为您处理刷新动画。
你可以添加一个 OnRefreshListener 来刷新你的 webview
【讨论】:
【参考方案6】:这应该可以完美运行!在您的布局文件中,将 webview 包装在 SwipeRefreshLayout 中。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_
android:layout_
>
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swipeContainer"
android:layout_
android:layout_
>
<WebView
android:layout_
android:layout_
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:id="@+id/webView"
/>
</android.support.v4.widget.SwipeRefreshLayout>
</RelativeLayout>
在您的 Java 文件中,声明 SwipeRefreshLayout mySwipeRefreshLayout;
课外。
然后,将此添加到onCreate()
方法中
mySwipeRefreshLayout = (SwipeRefreshLayout)this.findViewById(R.id.swipeContainer);
mySwipeRefreshLayout.setOnRefreshListener(
new SwipeRefreshLayout.OnRefreshListener()
@Override
public void onRefresh()
mWebview.reload();
mWebview.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
// This is important as it forces webview to load from the instead of reloading from cache
mWebview .loadUrl(getString(R.string.app_link));
);
【讨论】:
你不需要添加这一行,因为它默认设置为LOAD_DEFAULT
模式mWebview.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
【参考方案7】:
在研究过程中,我发现可以通过三种简单的方法在 Android 应用程序中实现拉取刷新:
您可以使用第三方库/SDK 或 您可以使用您的自定义实现(例如这里提到的代码 sn-ps)。此选项更复杂,但为定制提供了更大的灵活性 或 在 Android WebViewGold 的 Config.java 中,只需将 ENABLE__PULL_REFRESH 设置为 true滚动愉快!
【讨论】:
以上是关于在 webview 上添加 pull to refresh 以进行刷新的主要内容,如果未能解决你的问题,请参考以下文章
如何在 UIView(不是 UITableView、UICollectionView、UIScrollView)上添加 Pull-to-refresh
Git_错误_01_failed to push some refs to 'git@github.com
《Git与Github使用笔记》解决:git push error: failed to push some refs to XXX
《Git与Github使用笔记》解决:git push error: failed to push some refs to XXX