Android WebView не загружает URL?
У меня есть Android WebView, который должен загружать следующие URL-адреса:
https://buchung.salonmeister.de/ort/301655/menue/#offerId=907601&venueId=301655
https://buchung.salonmeister.de/place/#offer-details-page?id=907599&venueId=301655
Вот что я сделал:
<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>
В 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;
}
Экран пуст, когда я начинаю свою деятельность.
Примечание. Это не проблема макета. Пожалуйста, не комментируйте макет и не сосредоточьтесь на реальной проблеме.
Как загрузить вышеуказанные URL-адреса в WebView?
Изменить: Вот разрешения, которые я дал:
<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" />
Изменить:
В моей консоли я получаю следующее:
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)
Ответы
Ответ 1
Первой проблемой является замена позиции 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"/>
<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"/>
Вторая проблема заключается в этой строке:
android:layout_above="@+id/progressBar"
Внутри RelativeLayout вы должны заранее объявить идентификатор вида, чтобы другое представление можно было развернуть выше (справа, слева так же).
И снова будет та же строка:
android:layout_above="@+id/progressBar"
Внутри RelativeView представление не может размещать выше (или ниже, слева направо) на идентификатор, который генерируется ни для чего.
Вы делаете
@+id/progressBar
среда IDE будет автоматически генерировать новый идентификатор, этот идентификатор не совпадает с идентификатором, означающим, что WebView должен иметь вид выше. И в вашем объявлении ProgressBar вы снова @+ id/progressBar, который будет повторно генерировать другой идентификатор.
Итак, ваш WebView не имеет ничего общего, вы даже не видите WebView, он может загружать URL-адреса, и вы просто не видите его.
Удачи.
Ответ 2
Ваш URL-адрес https, так что это проблема ssl.
Вы можете найти решение в другом вопросе.
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
}
});
Ответ 3
UPDATE: с setJavaScriptEnabled(false);
, Url "https://buchung.salonmeister.de/ort/301655/menue/#offerId=907601&venueId=301655"
может успешно отображаться в 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;
}
}
Я использовал весь ваш код, вот мой результат веб-представления. Я думаю, возможно, что веб-сайт не готов для мобильных устройств, потому что я пытался открыть ваши 2 URL-адреса в веб-браузере в телефоне той же самой проблемой (по-прежнему загружаю...)
![введите описание изображения здесь]()
Ответ 4
если вы хотите, вы можете попробовать использовать Неопределенный индикатор строки выполнения и удалить setWebChromeClient
попробуйте этот код:
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;
}
}
Ответ 5
Убедитесь, что вы помещаете все разрешения в файл манифеста за пределы тега приложения.
Ответ 6
Это может решить вашу проблему:
webView.post(new Runnable() {
@Override
public void run() {
webView.loadUrl(url);
}
});
Ответ 7
Я столкнулся с той же проблемой. Установка useWideViewPort из настроек WebView в значение true устранила проблему. WebView#getSettings().setUseWideViewPort(true);