【发布时间】: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