J'ai une application Android qui a une vue Web. En l'absence de connexion Internet, Webview affichera la page non disponible. Je souhaite que cela ressemble le plus possible à une application, je ne souhaite donc pas afficher cette page. J'ai trouvé des informations utiles en ligne vous expliquant comment masquer ou charger quelque chose pour les masquer, mais ce que je veux vraiment, c'est rester à la page actuelle. En gros, lorsque l'utilisateur clique sur un élément de la vue Web, vérifiez d'abord la connexion. s'il n'y a pas de connexion, restez à sa place et ouvrez une boîte de dialogue.
Merci pour l'aide!!
Édité:
Comme je le disais, je sais déjà comment vérifier la connexion Internet des échantillons en ligne. Mon problème est que je ne sais pas comment arrêter de charger la page suivante. Pour être clair, lorsque les utilisateurs essaient de passer à la page suivante, vérifiez leur connexion Internet. S'il n'y a pas de connexion, la page restera telle quelle et n'irait pas à la page suivante. Je veux que les utilisateurs puissent voir leur dernière page chargée et s’informer alors que le contenu de la page Web est toujours là. Merci!
J'ai utilisé les éléments suivants dans mes projets:
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());
}
}
Code principal:
if (!DetectConnection.checkInternetConnection(this)) {
Toast.makeText(getApplicationContext(), "No Internet!", Toast.LENGTH_SHORT).show();
} else {
wv = (WebView) findViewById(R.id.donate_webView1);
c = new CustomWebViewClient();
wv.setWebViewClient(c);
wv.clearCache(true);
wv.clearHistory();
wv.getSettings().setJavaScriptEnabled(true);
wv.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
wv.getSettings().setBuiltInZoomControls(true);
wv.loadUrl("http://www.google.com");
}
// Function to load all URLs in same webview
private class CustomWebViewClient extends WebViewClient {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (!DetectConnection.checkInternetConnection(this)) {
Toast.makeText(getApplicationContext(), "No Internet!", Toast.LENGTH_SHORT).show();
} else {
view.loadUrl(url);
}
return true;
}
}
Mettre à jour le manifeste:
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
Vous pouvez utiliser ma CustomWebViewClient
il -
Tout ce que vous avez à faire est de l’attacher à votre webView
webView.setWebViewClient (nouveau CustomWebViewClient ());
Classe CustomWebViewClient
/**
* WebViewClient subclass loads all hyperlinks in the existing WebView
*/
public class CustomWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// When user clicks a hyperlink, load in the existing WebView
view.loadUrl(url);
return true;
}
Dialog loadingDialog = new Dialog(WebViewActivity.this);
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
webViewPreviousState = PAGE_STARTED;
if (loadingDialog == null || !loadingDialog.isShowing())
loadingDialog = ProgressDialog.show(WebViewActivity.this, "",
"Loading Please Wait", true, true,
new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
// do something
}
});
loadingDialog.setCancelable(false);
}
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void onReceivedError(WebView view, WebResourceRequest request,
WebResourceError error) {
if (isConnected()) {
final Snackbar snackBar = Snackbar.make(rootView, "onReceivedError : " + error.getDescription(), Snackbar.LENGTH_INDEFINITE);
snackBar.setAction("Reload", new View.OnClickListener() {
@Override
public void onClick(View view) {
webView.loadUrl("javascript:window.location.reload( true )");
}
});
snackBar.show();
} else {
final Snackbar snackBar = Snackbar.make(rootView, "No Internet Connection ", Snackbar.LENGTH_INDEFINITE);
snackBar.setAction("Enable Data", new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivityForResult(new Intent(Settings.ACTION_WIRELESS_SETTINGS), 0);
webView.loadUrl("javascript:window.location.reload( true )");
snackBar.dismiss();
}
});
snackBar.show();
}
super.onReceivedError(view, request, error);
}
@RequiresApi(api = Build.VERSION_CODES.Lollipop)
@Override
public void onReceivedHttpError(WebView view,
WebResourceRequest request, WebResourceResponse errorResponse) {
if (isConnected()) {
final Snackbar snackBar = Snackbar.make(rootView, "HttpError : " + errorResponse.getReasonPhrase(), Snackbar.LENGTH_INDEFINITE);
snackBar.setAction("Reload", new View.OnClickListener() {
@Override
public void onClick(View view) {
webView.loadUrl("javascript:window.location.reload( true )");
}
});
snackBar.show();
} else {
final Snackbar snackBar = Snackbar.make(rootView, "No Internet Connection ", Snackbar.LENGTH_INDEFINITE);
snackBar.setAction("Enable Data", new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivityForResult(new Intent(Settings.ACTION_WIRELESS_SETTINGS), 0);
webView.loadUrl("javascript:window.location.reload( true )");
snackBar.dismiss();
}
});
snackBar.show();
}
super.onReceivedHttpError(view, request, errorResponse);
}
@Override
public void onPageFinished(WebView view, String url) {
if (webViewPreviousState == PAGE_STARTED) {
if (null != loadingDialog) {
loadingDialog.dismiss();
loadingDialog = null;
}
}
}
}
Vérifier la méthode de connectivité
/**
* Check if there is any connectivity
*
* @return is Device Connected
*/
public boolean isConnected() {
ConnectivityManager cm = (ConnectivityManager)
this.getSystemService(Context.CONNECTIVITY_SERVICE);
if (null != cm) {
NetworkInfo info = cm.getActiveNetworkInfo();
return (info != null && info.isConnected());
}
return false;
}
Vous voudrez remplacer la méthode shouldOverrideUrlLoading d'un WebViewClient pour capturer les clics d'URL.
Pour vérifier l’état de la connexion Wi-Fi, vous devrez utiliser ConnectivityManager .
Essaye ça:
WebView mWebView;
NetworkInfo networkInfoWifi = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE).getNetworkInfo(ConnectivityManager.TYPE_WIFI);
mWebView.setWebViewClient(mWebClient);
WebViewClient mWebClient = new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url){
return true;
}
@Override
public void onLoadResource(WebView view, String url){
if (networkInfoWifi.isConnected()) {
//Take action
}
}
}
Je vous recommande de diviser votre problème en deux étapes plus petites - Cliquez sur Interception et Vérification de l'état de la connexion, puis recherchez-les. Cela donne beaucoup de résultats, et j'ai pu utiliser ces deux réponses existantes pour assembler le code:
Vous pouvez vérifier que votre appareil est connecté à Internet via des données ou par wifi en suivant le code
ConnectivityManager manager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo i = manager.getActiveNetworkInfo();
boolean hasConnect = (i!= null && i.isConnected() && i.isAvailable());
if(hasConnect)
{
// show the webview
}
else
{
// do what ever you need when when no internet connection
}
Une fois que l'utilisateur a accédé à la vue Web, si la connexion est perdue, vous pouvez capturer cet événement à partir du code suivant.
webView.setWebViewClient(new Callback());
public class Callback extends WebViewClient{
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl){
Toast.makeText(getApplicationContext(), "Failed loading app!, No Internet Connection found.", Toast.LENGTH_SHORT).show();
}
}
les autorisations suivantes doivent donner
<uses-permission Android:name="Android.permission.INTERNET" />
<uses-permission Android:name="Android.permission.READ_PHONE_STATE" />
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
webView.setWebViewClient(new WebViewClient() {
int errorCode = 0;
@SuppressWarnings("deprecation")
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return handleUri(view, url);
}
@TargetApi(Build.VERSION_CODES.N)
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
return handleUri(view, request.getUrl().toString());
}
private boolean handleUri(WebView view, final String url) {
view.loadUrl(url);
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
if(errorCode == 0) {
//CHECK IS PAGE I NEED AND DO STUFF
} else {
errorCode = 0;
//delay and try again
}
}
@SuppressWarnings("deprecation")
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
handleError(errorCode);
}
@TargetApi(Build.VERSION_CODES.N)
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
handleError(error.getErrorCode());
}
private void handleError(int errorCode) {
this.errorCode = errorCode;
}
});