【问题标题】:Android app stops after pull-to-refresh actionAndroid 应用程序在拉动刷新操作后停止
【发布时间】:2020-02-21 10:38:31
【问题描述】:

我遇到了以下问题:我正在使用片段制作一个 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;
}    

你能帮帮我吗?

【问题讨论】:

  • 您能否在日志中添加您遇到的崩溃错误?
  • 您创建了 mWebView 和 webView-它们是同一个实例吗?
  • 只有在您的 webview 完成加载其内容后,您才需要调用 mRefreshLayout.setRefreshing(false)。您可以在 webview 对象上处理 onPageFinished 回调,然后在那边将刷新设置为 false。
  • mWebView.reload() 在空对象引用上,初始化 mWebView 并完成!
  • 替换这个 mWebView.reload();通过 webView.reload();您正在初始化 webView 变量并在 mWebView 上调用 reload

标签: android android-fragments webview crash


【解决方案1】:

如果我们没有遗漏您的部分代码,那么您已经为 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】:

    您使用了错误的 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;
        }
    } 
    

    【讨论】:

      猜你喜欢
      • 2018-05-29
      • 1970-01-01
      • 2013-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      • 2018-05-19
      • 1970-01-01
      相关资源
      最近更新 更多