BrowserFragment.java
4.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package com.studymachine.www.ui.fragment;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.webkit.WebView;
import androidx.annotation.NonNull;
import com.studymachine.www.R;
import com.studymachine.www.action.StatusAction;
import com.studymachine.www.aop.CheckNet;
import com.studymachine.www.aop.Log;
import com.studymachine.www.app.AppActivity;
import com.studymachine.www.app.AppFragment;
import com.studymachine.www.ui.activity.BrowserActivity;
import com.studymachine.www.widget.BrowserView;
import com.studymachine.www.widget.StatusLayout;
import com.scwang.smart.refresh.layout.SmartRefreshLayout;
import com.scwang.smart.refresh.layout.api.RefreshLayout;
import com.scwang.smart.refresh.layout.listener.OnRefreshListener;
/**
* time : 2020/10/24
* desc : 浏览器 Fragment
*/
public final class BrowserFragment extends AppFragment<AppActivity>
implements StatusAction, OnRefreshListener {
private static final String INTENT_KEY_IN_URL = "url";
@Log
public static BrowserFragment newInstance(String url) {
BrowserFragment fragment = new BrowserFragment();
Bundle bundle = new Bundle();
bundle.putString(INTENT_KEY_IN_URL, url);
fragment.setArguments(bundle);
return fragment;
}
private StatusLayout mStatusLayout;
private SmartRefreshLayout mRefreshLayout;
private BrowserView mBrowserView;
@Override
protected int getLayoutId() {
return R.layout.browser_fragment;
}
@Override
protected void initView() {
mStatusLayout = findViewById(R.id.hl_browser_hint);
mRefreshLayout = findViewById(R.id.sl_browser_refresh);
mBrowserView = findViewById(R.id.wv_browser_view);
// 设置 WebView 生命周期回调
mBrowserView.setLifecycleOwner(this);
// 设置网页刷新监听
mRefreshLayout.setOnRefreshListener(this);
}
@Override
protected void initData() {
mBrowserView.setBrowserViewClient(new AppBrowserViewClient());
mBrowserView.setBrowserChromeClient(new BrowserView.BrowserChromeClient(mBrowserView));
mBrowserView.loadUrl(getString(INTENT_KEY_IN_URL));
showLoading();
}
@Override
public StatusLayout getStatusLayout() {
return mStatusLayout;
}
/**
* 重新加载当前页
*/
@CheckNet
private void reload() {
mBrowserView.reload();
}
/**
* {@link OnRefreshListener}
*/
@Override
public void onRefresh(@NonNull RefreshLayout refreshLayout) {
reload();
}
private class AppBrowserViewClient extends BrowserView.BrowserViewClient {
/**
* 网页加载错误时回调,这个方法会在 onPageFinished 之前调用
*/
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
// 这里为什么要用延迟呢?因为加载出错之后会先调用 onReceivedError 再调用 onPageFinished
post(() -> showError(listener -> reload()));
}
/**
* 开始加载网页
*/
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {}
/**
* 完成加载网页
*/
@Override
public void onPageFinished(WebView view, String url) {
mRefreshLayout.finishRefresh();
showComplete();
}
/**
* 跳转到其他链接
*/
@Override
public boolean shouldOverrideUrlLoading(WebView view, final String url) {
String scheme = Uri.parse(url).getScheme();
if (scheme == null) {
return true;
}
switch (scheme.toLowerCase()) {
// 如果这是跳链接操作
case "http":
case "https":
BrowserActivity.start(getAttachActivity(), url);
break;
default:
break;
}
// 已经处理该链接请求
return true;
}
}
}