带有 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 错误错误行为向上滚动

带有 Javascript 的 WebView 不断重新加载

带有 webview 的 UIView 滚动

带有 JavaScript 界面的 Webview