带有 Webview 的 SwipeRefreshLayout 不起作用
Posted
技术标签:
【中文标题】带有 Webview 的 SwipeRefreshLayout 不起作用【英文标题】:SwipeRefreshLayout with Webview not working 【发布时间】:2017-11-07 01:26:08 【问题描述】:这是我的带有 SwipeRefreshLayout 的 webview 应用程序代码。但是 SwipeRefresh 不起作用,请检查一下。但所有其他事情都正常工作。像 webview、菜单按钮。
下面是我的 activity_main.xml 文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout>
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swipe"
android:layout_
android:layout_>
<WebView
android:layout_
android:layout_
android:layout_centerHorizontal="true"
android:id="@+id/webView"
/>
</android.support.v4.widget.SwipeRefreshLayout>
</RelativeLayout>
这是我的MainActivity.java
文件
public class MainActivity extends AppCompatActivity
WebView webView;
SwipeRefreshLayout swipe;
@Override
public boolean onCreateOptionsMenu (Menu manu)
getMenuInflater().inflate(R.menu.main, manu);
return true;
@Override
public boolean onOptionsItemSelected (MenuItem item)
int id=item.getItemId();
if(id==R.id.id_about)
Intent intentabout=new Intent(MainActivity.this, About.class);
startActivity(intentabout);
return true;
if(id==R.id.id_terms)
return true;
if(id==R.id.id_privacy)
return true;
return true;
@Override
public void onBackPressed()
if(webView.canGoBack())
webView.goBack();
else
super.onBackPressed();
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
swipe = (SwipeRefreshLayout) findViewById(R.id.swipe);
swipe.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener()
@Override
public void onRefresh()
LoadWeb();
);
LoadWeb();
public void LoadWeb()
webView = (WebView) findViewById(R.id.webView);
WebSettings webSettings = webView.getSettings();
webSettings.setjavascriptEnabled(true);
webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH);
webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
webSettings.setDomStorageEnabled(true);
webSettings.setAppCacheEnabled(true);
webView.loadUrl("https://google.com");
swipe.setRefreshing(true);
webView.setWebViewClient(new WebViewClient()
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)
webView.loadUrl("file:///android_asset/error.html");
public void onPagefinished(WebView view, String url)
swipe.setRefreshing(false);
);
【问题讨论】:
可以参考以下github.com/zhangle1/HelpText/tree/master/app/src 【参考方案1】:您可以将您的 Webview 放在 NestedScrollView
中以完成这项工作。
例子:
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swipe"
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.support.v4.widget.NestedScrollView>
【讨论】:
不再需要嵌套nestedscrollview,swiperefreshlayout继承自NestedScrollingParent和NestedScrollingChild 这是一个完整的解决方案!具有正确的滑动行为。这应该是公认的答案!【参考方案2】:您必须将 WebView 放入 SwipeRefreshLayout:
public class MainActivity extends AppCompatActivity
WebView webView;
SwipeRefreshLayout swipeRefreshLayout;
String currentUrl = "https://www.google.co.in/";
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = (WebView) findViewById(R.id.webView);
swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout);
webView.loadUrl(currentUrl);
webView.setWebViewClient(new MyWebViewClient());
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener()
@Override
public void onRefresh()
webView.loadUrl(currentUrl);
);
public class MyWebViewClient extends WebViewClient
@Override
public void onPageFinished(WebView view, String url)
swipeRefreshLayout.setRefreshing(false);
currentUrl = url;
super.onPageFinished(view, url);
swipeRefreshLayout.setRefreshing(false) 停止动画。
【讨论】:
谢谢哈希尔。现在它的工作。非常感谢。现在我有一个问题,如何在初始 webview 加载时显示加载轮。 这里我在初始化webview时添加了加载轮***.com/questions/44407308/…【参考方案3】:你应该添加
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
swipe = (SwipeRefreshLayout) findViewById(R.id.swipe);
swipe.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener()
@Override
public void onRefresh()
LoadWeb();
);
swipe.setRefreshing(true); //add
LoadWeb();
LoadWeb();
【讨论】:
您需要将刷新状态自动更改为true,以便显示Loading 尝试删除RelativeLayout或尝试升级兼容包版本编译'com.android.support:appcompat-v7:25.3.1' 删除RelativeLayout 不显示任何差异。我完全是新的。请指出如何升级兼容的软件包版本。在我的 build.gradle 中显示 compile 'com.android.support:appcompat-v7:22.2.1' 你应该修改Android compileSdkVersion 25以上是关于带有 Webview 的 SwipeRefreshLayout 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Jetpack ComposeLazyColumn 使用Paging3分页+SwipeRefresh下拉刷新
Android-利用Jetpack-Compose-+Paging3+swiperefresh实现分页加载,下拉上拉效果
带有滑动手势的运动布局 + SwipeRefreshLayout + RecyclerView 错误错误行为向上滚动