android - 如何在 webview 中显示无 Internet 连接对话框 | 安卓工作室
问题描述
我正在尝试在 Web 视图中添加一条消息,当您没有 Internet 连接时,该消息应该会出现。
我尝试了很多方法,但我总是犯一个我不明白的错误。
我创建了一个名为“assets”的文件夹,并在 YouTube 教程之后添加了一个文件“error.html”,但它给了我错误
我将在这里写我的代码,而不是我在 YouTube 上看到的。
谢谢
MainActivity.java
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v4.widget.SwipeRefreshLayout;
import android.view.KeyEvent;
import android.view.View;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener, SwipeRefreshLayout.OnRefreshListener {
private WebView wv;
private SwipeRefreshLayout sr;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.addDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
navigationView.setItemIconTintList(null);
sr = (SwipeRefreshLayout) findViewById(R.id.sr);
sr.setOnRefreshListener(this);
wv=(WebView)findViewById(R.id.wv);
WebSettings webSettings=wv.getSettings();
webSettings.setJavaScriptEnabled(true);
wv.loadUrl("//MyURL//");
wv.setWebViewClient(new WebViewClient());
wv.setWebViewClient(new CustomWebViewClient());
}
private class CustomWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if(url.contains("//MyURL//")) {
view.loadUrl(url);
} else {
Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(i);
}
return true;
}
}
@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return false;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
if (id == R.id.Inicio) {
wv.loadUrl("//social//");
} else if (id == R.id.Insta) {
wv.loadUrl("//social//");
} else if (id == R.id.Facebook) {
wv.loadUrl("//social//");
} else if (id == R.id.Twitter) {
wv.loadUrl("//social//");
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
@Override
public void onRefresh() {
wv.reload();
sr.setRefreshing(false);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && wv.canGoBack()) {
//if Back key pressed and webview can navigate to previous page
wv.goBack();
// go back to previous page
return true;
}
else
{
finish();
// finish the activity
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
int action = event.getAction();
int keyCode = event.getKeyCode();
switch (keyCode) {
case KeyEvent.KEYCODE_VOLUME_UP:
if (action == KeyEvent.ACTION_UP) {
// TODO
}
return false;
case KeyEvent.KEYCODE_VOLUME_DOWN:
if (action == KeyEvent.ACTION_DOWN) {
//TODO
}
return false;
default:
return super.dispatchKeyEvent(event);
}
}
}
内容_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".MainActivity"
tools:showIn="@layout/app_bar_main">
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/sr"
android:layout_width="match_parent"
android:layout_height="match_parent">
<WebView
android:id="@+id/wv"
android:layout_width="match_parent"
android:layout_height="match_parent">
</WebView>
</android.support.v4.widget.SwipeRefreshLayout>
</LinearLayout>
谢谢你
解决方案
1) 创建DetectConnection.java 类来检查互联网是否可用。
import android.content.Context;
import android.net.ConnectivityManager;
public class DetectConnection {
public static boolean checkInternetConnection(Context context) {
ConnectivityManager con_manager = (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
return (con_manager.getActiveNetworkInfo() != null
&& con_manager.getActiveNetworkInfo().isAvailable()
&& con_manager.getActiveNetworkInfo().isConnected());
}
}
2)更改onCreate方法的代码,在加载之前检查互联网是否可用,
wv = (WebView) findViewById(R.id.wv);
CustomWebViewClient c = new CustomWebViewClient();
wv.setWebViewClient(c);
wv.clearCache(true);
wv.clearHistory();
wv.getSettings().setJavaScriptEnabled(true);
wv.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
wv.getSettings().setBuiltInZoomControls(true);
if (!DetectConnection.checkInternetConnection(this)) {
wv.loadUrl("file:///android_asset/error.html"); //Change path if it is not correct
} else {
wv.loadUrl("http://www.google.com");
}
3) 更改CustomWebViewClient 的代码。这是一个类,您可以在其中获取每个 URL 的回调。在该回调中,一旦页面完成加载,您就可以检查它。
// Function to load all URLs in same webview
private class CustomWebViewClient extends WebViewClient {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if(url.contains("//MyURL//")) {
view.loadUrl(url);
} else {
Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(i);
}
return true;
}
@Override
public void onLoadResource(WebView view, String url){
if (!DetectConnection.checkInternetConnection(MainActivity.this)) {
wv.loadUrl("file:///android_asset/error.html"); //Change path if it is not correct
}
}
}
4) 在 AndroidMenifest.xml 中添加 ACCESS_NETWORK_STATE 权限。
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
推荐阅读
- kubernetes - 如何在手动将现有对象升级到 k8s 客户资源中的新存储版本时从 status.storedVersions 中删除版本
- ios - 使用 SwiftUI 从 Wireframe 创建一个新的 VIPER 模块
- javascript - 将背景图像高度设置为视口高度
- android - 从字符串转换为 JSONArray
- leaflet - 有没有办法在传单中显示没有特征的geojson的属性?
- nginx - 错误 org.keycloak.adapters.OAuthRequestAuthenticator - 无法将代码转换为令牌
- git - 如何将我Mac桌面上的文件夹推送到我朋友在Github上的仓库分支?
- autodesk-forge - Autodesk forge Usage Analytics 不会显示任何数据
- ffmpeg - ffmpeg 视频转 jpg 帧质量差
- php - PHP为隐藏目录创建404