我正在使用WebView开发Android应用程序。在那个WebView中我有一个按钮。当我点击该按钮并且没有可用的互联网时,我需要显示错误消息。但我无法做到这一点。有人有想法吗?任何帮助将受到高度赞赏。以下是我的代码。
@SuppressLint("SetJavaScriptEnabled")
public class DashboardFragment extends Fragment implements SolutionHandler {
private final String SAVE_DASHBOARD_PAGE = "saveDashboardPage";
private final String SAVE_DASHBOARD_WEB_STATE = "saveDashboardWebState";
private final String DASHBOARD_URL = "https://api.myapp.com/api_endpoint/dashboard/";
private final String LOGOUT_URL = "myapp://logout/";
private final String SOLUTION_URL = "myapp://solution/open?solution_id";
private final String MY_APP = "myapp://";
private final String SUPPORT_URL = "http://support";
private View dashboardView;
private WebView dashboardWebView;
private String currentUrl;
private User user;
private LoadingDialog loadingDialog;
private Bundle webState;
private int supportUrlAcessCount = 0;
public DashboardFragment() {
setRetainInstance(true);
}
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
OptimizeHIT.sendScreen(GAnalyticsScreenNames.DASHBOARD_SCREEN, null, null);
dashboardView = inflater.inflate(R.layout.fragment_dashboard, container, false);
user = User.sharedUser(getActivity());
if (savedInstanceState != null) {
currentUrl = savedInstanceState.getString(SAVE_DASHBOARD_PAGE);
webState = savedInstanceState.getBundle(SAVE_DASHBOARD_WEB_STATE);
}
if (currentUrl == null || currentUrl.length() == 0) {
currentUrl = DASHBOARD_URL + user.hash();
}
loadingDialog = new LoadingDialog(getActivity(), R.string.loading_dashboard, R.string.icon_arrows_cw, true);
WebChromeClient webClient = new WebChromeClient();
if (dashboardWebView == null) {
dashboardWebView = new WebView(getActivity());
dashboardWebView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
dashboardWebView.setVerticalScrollBarEnabled(true);
dashboardWebView.setHorizontalScrollBarEnabled(true);
dashboardWebView.requestFocusFromTouch();
dashboardWebView.getSettings().setAppCachePath(getActivity().getCacheDir().getAbsolutePath());
dashboardWebView.getSettings().setAppCacheEnabled(true);
dashboardWebView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
// dashboardWebView.setOnTouchListener(webViewTouchListener);
dashboardWebView.setWebChromeClient(webClient);
dashboardWebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
// TODO Auto-generated method stub
if(!isNetworkAvailable(getActivity())){
showNoInternetError();
}
super.onPageStarted(view, url, favicon);
}
@Override
public void onPageFinished(WebView view, String url) {
if (url.startsWith(DASHBOARD_URL)) {
view.clearHistory();
loadingDialog.dismiss();
}
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url != null && url.startsWith(OHITAPP)) {
if (url.startsWith(SOLUTION_URL)) {
loadingDialog.setStringResource(R.string.loading_solution);
loadingDialog.show();
Locker.lock(getActivity());
Pattern pattern = Pattern.compile("[0-9]+");
Matcher matcher = pattern.matcher(url);
String solutionId = "";
if (matcher.find()) {
solutionId = matcher.group();
}
}
return true;
} else if (url.startsWith(SUPPORT_URL)) {
supportUrlAcessCount++;
if (supportUrlAcessCount == 2) {
((MenuActivity) getActivity()).changeFragment(6, false, false, false, null, null);
return true;
}
return false;
} else {
return false;
}
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
if ((failingUrl.startsWith(SUPPORT_URL) && supportUrlAcessCount == 2)
|| failingUrl.startsWith(OHITAPP)) {
return;
}
showNoInternetError();
}
});
if (webState == null) {
if (CheckConnectionHelper.isNetworkAvailable(getActivity())) {
loadingDialog.show();
dashboardWebView.loadUrl(currentUrl);
} else {
ErrorHelper.showError(TalkersConstants.JUST_FAILURE, (SuperActivity) getActivity());
dashboardWebView.loadUrl("about:blank");
}
dashboardWebView.getSettings().setSupportZoom(true);
dashboardWebView.getSettings().setBuiltInZoomControls(true);
dashboardWebView.getSettings().setDisplayZoomControls(false);
dashboardWebView.getSettings().setLoadWithOverviewMode(true);
dashboardWebView.getSettings().setUseWideViewPort(true);
dashboardWebView.getSettings().setJavaScriptEnabled(true);
} else {
dashboardWebView.restoreState(webState);
}
} else {
if (webState == null) {
loadingDialog.show();
dashboardWebView.loadUrl(currentUrl);
dashboardWebView.getSettings().setSupportZoom(true);
dashboardWebView.getSettings().setBuiltInZoomControls(true);
dashboardWebView.getSettings().setDisplayZoomControls(false);
dashboardWebView.getSettings().setLoadWithOverviewMode(true);
dashboardWebView.getSettings().setUseWideViewPort(true);
dashboardWebView.getSettings().setJavaScriptEnabled(true);
} else {
dashboardWebView.restoreState(webState);
}
}
LinearLayout dashboardContainer = (LinearLayout) dashboardView.findViewById(R.id.dashboard_container);
dashboardContainer.addView(dashboardWebView);
getActivity().getWindow().getDecorView().getViewTreeObserver()
.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
dashboardView.requestLayout();
}
});
return dashboardView;
}
@Override
public void onDestroyView() {
LinearLayout dashboardContainer = (LinearLayout) dashboardView.findViewById(R.id.dashboard_container);
dashboardContainer.removeView(dashboardWebView);
super.onDestroyView();
}
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putString(SAVE_DASHBOARD_PAGE, getCurrentPage());
outState.putBundle(SAVE_DASHBOARD_WEB_STATE, getCurrentWebViewState());
super.onSaveInstanceState(outState);
}
public String getCurrentPage() {
return dashboardWebView.getUrl();
}
public Bundle getCurrentWebViewState() {
Bundle outState = new Bundle();
dashboardWebView.saveState(outState);
return outState;
}
public boolean navigatesBack() {
if (dashboardWebView != null && dashboardWebView.canGoBack()) {
dashboardWebView.goBack();
return true;
}
return false;
}
public void showNoInternetError() {
loadingDialog.dismiss();
ErrorHelper.showError(TalkersConstants.JUST_FAILURE, (SuperActivity) getActivity());
dashboardWebView.loadUrl("about:blank");
}
public void reloadWebView() {
if (dashboardWebView.getUrl() == null
|| dashboardWebView.getUrl().isEmpty()
|| dashboardWebView.getUrl().equals("about:blank")) {
dashboardWebView.loadUrl(currentUrl);
}
}
OnTouchListener webViewTouchListener = new OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
if (System.currentTimeMillis() - SuperActivity.savedLastClickTime < 1000) {
Log.d("I AM IN A FALSE", "FALSE");
return true;
}
SuperActivity.savedLastWebViewInteractionTime = System.currentTimeMillis();
Log.d("I AM IN A TOUCH LISTENER", "TOUCH LISTENER");
return false;
}
};
public boolean isNetworkAvailable( Context context ) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}
}
答案 0 :(得分:0)
创建一个公共类ConnectionDetector
public class ConnectionDetector {
private Context _context;
public ConnectionDetector(Context context) {
this._context = context;
}
public boolean isConnectingToInternet() {
ConnectivityManager connectivity = (ConnectivityManager) _context
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity != null) {
NetworkInfo[] info = connectivity.getAllNetworkInfo();
if (info != null)
for (int i = 0; i < info.length; i++)
if (info[i].getState() == NetworkInfo.State.CONNECTED) {
return true;
}
}
return false;
}
}
之后在您的活动或片段中初始化这些变量
ConnectionDetector cd;
Boolean isInternetPresent = false;
在调用webView之前,只需检查这样的连接
cd = new ConnectionDetector(context);
isInternetPresent = cd.isConnectingToInternet();
keyBoardHide();
if (isInternetPresent) {
//call webview here
} else {
// Use Toast to popup msg
}
答案 1 :(得分:0)
这是类比问题。您可以检查网络是否已打开,如果不是,则可以显示错误消息。
Detect whether there is an Internet connection available on Android