我遇到了以下问题:我正在使用片段制作一个 android webview 应用程序,我想实现一个 SwipeToRefresh 操作。

我尝试这样做,但应用程序在用户执行下拉刷新操作后立即停止。 以下是不同的代码:

fragment_home.xml :

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_red_light">

<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
    android:id="@+id/sr"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <WebView
        android:id="@+id/webviewhome"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></WebView>

</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>

</RelativeLayout>    

HomeFragment.java公共类 HomeFragment 扩展 Fragment {

public HomeFragment(){
    // Required
}

private SwipeRefreshLayout mRefreshLayout;
private WebView mWebView;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    View v = inflater.inflate(R.layout.fragment_home, container, false);
    mRefreshLayout = (SwipeRefreshLayout) v.findViewById(R.id.sr);
    mRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            mWebView.reload();
            mRefreshLayout.setRefreshing(false);
        }
    });
    final WebView webView = (WebView) v.findViewById(R.id.webviewhome);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.getSettings().setAppCacheEnabled(true);
    webView.loadUrl("MYURL");
    webView.setWebViewClient(new WebViewClient());
    webView.canGoBack();

    webView.setOnKeyListener(new View.OnKeyListener() {
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK
                    && event.getAction() == MotionEvent.ACTION_UP
                    && webView.canGoBack()) {
                webView.goBack();
                return true;
            }
            return false;
        }
    });

    webView.setWebViewClient(new WebViewClient() {
        public void onReceivedError(WebView webView, int errorCode, String description, String failingUrl) {
            try {
                webView.stopLoading();
            } catch (Exception e) {
            }

            if (webView.canGoBack()) {
                webView.goBack();
            }

            webView.loadUrl("about:blank");
            AlertDialog alertDialog = new AlertDialog.Builder(getContext()).create();
            alertDialog.setTitle("Erreur !");
            alertDialog.setMessage("Veuillez vérifier votre connexion internet et réessayer");
            alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "Réessayer", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    getActivity().finish();
                    startActivity(getActivity().getIntent());
                }
            });

            alertDialog.show();
            super.onReceivedError(webView, errorCode, description, failingUrl);
        }
    });

    return v;
}    

你能帮我吗?

#1楼 票数:0 已采纳

如果我们没有遗漏您的代码部分,那么您已经为 webview 创建了两个实例,在刷新布局中您调用了尚未初始化的 mWebView。 尝试这个:

public HomeFragment(){
    // Required
}

private SwipeRefreshLayout mRefreshLayout;
private WebView WebView;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

View v = inflater.inflate(R.layout.fragment_home, container, false);
mRefreshLayout = (SwipeRefreshLayout) v.findViewById(R.id.sr);
mRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
    @Override
    public void onRefresh() {
        mWebView.reload();
        mRefreshLayout.setRefreshing(false);
    }
});
webView = (WebView) v.findViewById(R.id.webviewhome);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setAppCacheEnabled(true);
webView.loadUrl("MYURL");
webView.setWebViewClient(new WebViewClient());
webView.canGoBack();

webView.setOnKeyListener(new View.OnKeyListener() {
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK
                && event.getAction() == MotionEvent.ACTION_UP
                && webView.canGoBack()) {
            webView.goBack();
            return true;
        }
        return false;
    }
});

webView.setWebViewClient(new WebViewClient() {
    public void onReceivedError(WebView webView, int errorCode, String description, String failingUrl) {
        try {
            webView.stopLoading();
        } catch (Exception e) {
        }

        if (webView.canGoBack()) {
            webView.goBack();
        }

        webView.loadUrl("about:blank");
        AlertDialog alertDialog = new AlertDialog.Builder(getContext()).create();
        alertDialog.setTitle("Erreur !");
        alertDialog.setMessage("Veuillez vérifier votre connexion internet et réessayer");
        alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "Réessayer", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                getActivity().finish();
                startActivity(getActivity().getIntent());
            }
        });

        alertDialog.show();
        super.onReceivedError(webView, errorCode, description, failingUrl);
    }
});

    return v;
}  

#2楼 票数:0

您使用了错误的 webview 参考

public class MyFragment extends Fragment {


    private SwipeRefreshLayout mRefreshLayout;
    private WebView webView;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        View v = inflater.inflate(R.layout.fragment_home, container, false);
        mRefreshLayout = (SwipeRefreshLayout) v.findViewById(R.id.sr);
        mRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                webView.reload();
                mRefreshLayout.setRefreshing(false);
            }
        });
        webView = v.findViewById(R.id.webviewhome);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setAppCacheEnabled(true);
        webView.loadUrl("https://stackoverflow.com/questions/tagged/android");
        webView.setWebViewClient(new WebViewClient());
        webView.canGoBack();

        webView.setOnKeyListener(new View.OnKeyListener() {
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_BACK
                        && event.getAction() == MotionEvent.ACTION_UP
                        && webView.canGoBack()) {
                    webView.goBack();
                    return true;
                }
                return false;
            }
        });

        webView.setWebViewClient(new WebViewClient() {
            public void onReceivedError(WebView webView, int errorCode, String description, String failingUrl) {
                try {
                    webView.stopLoading();
                } catch (Exception e) {
                }

                if (webView.canGoBack()) {
                    webView.goBack();
                }

                webView.loadUrl("about:blank");
                AlertDialog alertDialog = new AlertDialog.Builder(getContext()).create();
                alertDialog.setTitle("Erreur !");
                alertDialog.setMessage("Veuillez vérifier votre connexion internet et réessayer");
                alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "Réessayer", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        getActivity().finish();
                        startActivity(getActivity().getIntent());
                    }
                });

                alertDialog.show();
                super.onReceivedError(webView, errorCode, description, failingUrl);
            }
        });

        return v;
    }
} 

  ask by James Shelby translate from so

未解决问题?本站智能推荐:

2回复

当我打开一个Android应用程序时,它一直崩溃并显示“已停止工作”的消息

我试图运行我的应用程序,我刚刚收到一条消息“MegaVidi 停止工作”,我尝试运行一些测试并得到以下错误 我该如何解决这个问题,以便我的 APP 可以正常运行? 请帮帮我
1回复

每当我按操作栏中的按钮时,应用程序崩溃

每当我按下操作栏中的按钮时,我的应用程序就会崩溃,但仅当该按钮与Webview有关时,它才会发生。 但是web视图确实加载网页的onCreate方法仍然可以工作。 LogCat LogCat谈到了removeview()
1回复

检查是否未安装Android应用,然后提示祝酒消息

解决此问题: 如果已安装,如何打开android应用程序,如果未安装,如何进入android市场 我需要在启动应用程序之前检查是否已安装该应用程序,并且如果未提示用户类似“该应用程序未安装,请按从市场下载”中的提示消息,或自动链接至市场。 我的应用程序(主)是带有2个按钮的Web视图:
2回复

Android应用程序崩溃webview网址更改

与此问题类似,但解决方案并不适用于我的问题。 运行功能webview.loadUrl时,Android应用程序崩溃 关闭时收到以下错误: E / AndroidRuntime(1593):引起:java.lang.Throwable:警告:在线程'WebViewCoreThread
1回复

当您尝试打开URL时,阿里巴巴Android应用程序会导致崩溃[关闭]

当您尝试打开链接时,从whatsapp的示例中,应用程序(在本例中为whatsapp)崩溃。 只有在您的设备中安装了阿里巴巴应用程序时才会出现这种情况。 复制路径: 安装阿里巴巴应用( https://play.google.com/store/apps/details?id=com.
1回复

AndroidWebview在三星和Android11上崩溃

这是我们在 Firebase 上看到的堆栈跟踪: 我们无法重现这种情况,但我们在 Firebase 上遇到了成百上千的此类崩溃。 奇怪的是,99% 的崩溃都发生在运行 Android 11 的三星设备上。我们的应用程序也是单进程应用程序,所以它不应该运行多个进程。 我已经在 Chromium 问题跟
1回复

应用程序因base.apk!libmonochrome.so崩溃

我们最近遇到了大量崩溃,尤其是在三星、LG 设备(主要是 Android 10、11)中。 Play 控制台中的崩溃报告说:回溯:#00 pc 0000000001bb1ed8 /data/app/~~8ql0flEwCl8tpQXEDqYp-w==/com.google.android.webv
1回复

使用硬件加速功能的ViewPager中的WebViews导致Android进程崩溃

我有一个ViewPager活动,可用于浏览包含“随机”网页的片段。Web内容不受我控制。 我正在使用FragmentStatePagerAdapter和最新的支持库。 每个片段的布局都包含一个加载“随机”页面的Web视图。 用户可以无限期向前翻转。 当我打开硬件加速时,经过几次滑动后就