J'ai un WebView Android qui devrait charger les URL suivantes:
https://buchung.salonmeister.de/ort/301655/menue/#offerId=907601&venueId=301655
https://buchung.salonmeister.de/place/#offer-details-page?id=907599&venueId=301655
Voici ce que j'ai fait:
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="@Android:color/holo_orange_light"
tools:context=".MainActivityFragment">
<WebView
Android:id="@+id/webView"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_alignParentTop="true"
Android:layout_alignParentBottom="true"
Android:layout_margin="5dp"
Android:layout_above="@+id/progressBar"></WebView>
<ProgressBar
Android:id="@id/progressBar"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_alignParentBottom="true"
Android:visibility="invisible"
style="?android:attr/progressBarStyleHorizontal"/>
<TextView
Android:id="@+id/titleView"
Android:text="@string/hello_world"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"/>
</RelativeLayout>
Dans onCreateView()
:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_main, container, false);
String url = // some url
final ProgressBar progressBar = (ProgressBar)v.findViewById(R.id.progressBar);
progressBar.setMax(100);
final TextView titleView = (TextView)v.findViewById(R.id.titleView);
mWebView = (WebView)v.findViewById(R.id.webView);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setAllowFileAccess(true);
mWebView.getSettings().setAllowContentAccess(true);
mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
});
mWebView.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int progress) {
if (progress == 100) {
progressBar.setVisibility(View.INVISIBLE);
progressBar.setProgress(0);
} else {
progressBar.setVisibility(View.VISIBLE);
progressBar.setProgress(progress);
}
}
@Override
public void onReceivedTitle(WebView view, String title) {
titleView.setText(title);
}
});
mWebView.loadUrl(url);
return v;
}
L'écran est vide lorsque je commence mon activité.
Remarque: Ce n'est pas un problème de mise en page. Veuillez ne pas commenter la mise en page et vous concentrer sur le vrai problème.
Comment puis-je charger les URL ci-dessus dans une WebView?
Edit: Voici les permissions que j'ai données:
<uses-permission Android:name="Android.permission.INTERNET" />
<uses-permission Android:name="Android.permission.READ_PHONE_STATE" />
<uses-permission Android:name="Android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission Android:name="Android.permission.GET_ACCOUNTS" />
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
Modifier:
Dans ma console, j'ai le message suivant:
I/chromium: [INFO:CONSOLE(84)] "undefined", source: https://buchung.salonmeister.de/place/ (84)
09-13 15:12:33.230 28407-28407/de.test.webviewtest I/chromium: [INFO:CONSOLE(1)] "Uncaught Error: Script error for: widget/venue-menu/mobile/venue-menu-app
09-13 15:12:33.230 28407-28407/de.test.webviewtest I/chromium: http://requirejs.org/docs/errors.html#scripterror", source: https://buchung.salonmeister.de/javascript-module/1.162.3/thirdparty/require.2.1.10.js (1)
Le premier problème est que vous devez échanger la position de ProgressBar et WebView.
<ProgressBar
Android:id="@id/progressBar"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_alignParentBottom="true"
Android:visibility="invisible"
style="?android:attr/progressBarStyleHorizontal"/>
<WebView
Android:id="@+id/webView"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_alignParentTop="true"
Android:layout_alignParentBottom="true"
Android:layout_margin="5dp"
Android:layout_above="@id/progressBar"/>
Le deuxième problème est cette ligne:
Android:layout_above="@+id/progressBar"
À l'intérieur d'un RelativeLayout, vous devez avoir déclaré l'identifiant de la vue à l'avance, afin qu'une autre vue puisse être mise en haut au-dessus (à droite, à gauche, de la même manière).
Et encore est la même ligne:
Android:layout_above="@+id/progressBar"
Dans une vue relative, une vue ne peut pas mettre en haut (ou en bas, de gauche à droite) un ID qui est généré pour rien.
Tu fais
@+id/progressBar
le IDE générera automatiquement un nouvel ID. Cet ID n'est pas le même ID que celui que vous voulez utiliser pour la mise en page WebView. Et dans votre déclaration ProgressBar, vous @ + id/progressBar à nouveau, ce qui générera un autre identifiant.
Donc, votre WebView est mise en page ci-dessus à rien, vous ne pouvez même pas voir la WebView, il peut charger les URL, et vous ne pouvez pas le voir.
Bonne chance.
Votre URL est https, donc c’est un problème SSL.
Vous pouvez trouver une solution dans autre question .
mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
handler.proceed(); // Ignore SSL certificate errors
}
});
UPDATE: avec setJavaScriptEnabled(false);
, l’URL "https://buchung.salonmeister.de/ort/301655/menue/#offerId=907601&venueId=301655"
peut s’afficher avec succès dans WebView.
public class WebViewActivityFragment extends Fragment {
public WebViewActivityFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//return inflater.inflate(R.layout.fragment_web_view, container, false);
View v = inflater.inflate(R.layout.fragment_web_view, container, false);
final String url = "https://buchung.salonmeister.de/ort/301655/menue/#offerId=907601&venueId=301655";//"https://google.com.vn";
final ProgressBar progressBar = (ProgressBar)v.findViewById(R.id.progressBar);
progressBar.setMax(100);
final TextView titleView = (TextView)v.findViewById(R.id.titleView);
WebView mWebView = (WebView) v.findViewById(R.id.webView);
mWebView.setInitialScale(1);
mWebView.getSettings().setLoadWithOverviewMode(true);
mWebView.getSettings().setUseWideViewPort(true);
mWebView.getSettings().setJavaScriptEnabled(false);
mWebView.getSettings().setAllowFileAccess(true);
mWebView.getSettings().setAllowContentAccess(true);
mWebView.setScrollbarFadingEnabled(false);
mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
});
mWebView.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int progress) {
if (progress == 100) {
progressBar.setVisibility(View.INVISIBLE);
progressBar.setProgress(0);
} else {
progressBar.setVisibility(View.VISIBLE);
progressBar.setProgress(progress);
}
}
@Override
public void onReceivedTitle(WebView view, String title) {
titleView.setText(title);
}
});
mWebView.loadUrl(url);
return v;
}
}
J'ai utilisé tout votre code, voici le résultat de ma vue Web. Je pense que ce site Web n’est peut-être pas prêt pour la téléphonie mobile, car j’ai essayé d’ouvrir vos deux URL dans le navigateur Web de mon téléphone en raison du même problème (chargement en cours ...)
si vous le souhaitez, vous pouvez utiliser Exemple de barre de progression indéterminée et supprimer setWebChromeClient Essayez le code suivant:
public class WebViewActivityFragment extends Fragment {
public WebViewActivityFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//return inflater.inflate(R.layout.fragment_web_view, container, false);
View v = inflater.inflate(R.layout.fragment_web_view, container, false);
final String url = "https://buchung.salonmeister.de/ort/301655/menue/#offerId=907601&venueId=301655";//"https://google.com.vn";
final ProgressBar progressBar = (ProgressBar)v.findViewById(R.id.progressBar);
progressBar.setMax(100);
progressBar.setVisibility(View.GONE);
final TextView titleView = (TextView)v.findViewById(R.id.titleView);
WebView mWebView = (WebView) v.findViewById(R.id.webView);
mWebView.setInitialScale(1);
mWebView.getSettings().setLoadWithOverviewMode(true);
mWebView.getSettings().setUseWideViewPort(true);
mWebView.getSettings().setJavaScriptEnabled(false);
mWebView.getSettings().setAllowFileAccess(true);
mWebView.getSettings().setAllowContentAccess(true);
mWebView.setScrollbarFadingEnabled(false);
mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
@Override
public void onPageFinished(WebView view, String url) {
progressBar.setVisibility(View.GONE);
progressBar.setProgress(100);
super.onPageFinished(view, url);
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
progressBar.setVisibility(View.VISIBLE);
progressBar.setProgress(0);
super.onPageStarted(view, url, favicon);
}
});
mWebView.loadUrl(url);
return v;
}
}
Cela peut résoudre votre problème:
webView.post(new Runnable() {
@Override
public void run() {
webView.loadUrl(url);
}
});
Assurez-vous de mettre toutes les autorisations dans le fichier manifeste en dehors de la balise d'application.