我有一个Android WebView,它应该加载以下网址:
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;
}
开始活动时屏幕为空。
注意:这不是布局问题。请不要评论布局并关注真正的问题。
如何在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)
答案 0 :(得分:7)
第一个问题是你必须交换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中,您必须预先声明视图ID,以便可以在上方(右侧,左侧以相同的方式)布置另一个视图。
再次是同一条线:
android:layout_above="@+id/progressBar"
在RelativeView内部,视图无法在上方(或从下方,从左到右)布局到无生成的ID。
你做
@+id/progressBar
IDE会自动生成一个新的ID,这个ID与您在上面布局的WebView的ID不同。在你的ProgressBar声明中,你再次@ + id / progressBar,它将重新生成另一个id。
因此,您的WebView上面没有任何内容,您甚至无法看到WebView,它可能会加载URL,而您却无法看到它。
祝你好运。答案 1 :(得分:4)
您的网址是https,所以它是ssl问题。
您可以在other 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
}
});
答案 2 :(得分:3)
更新:使用setJavaScriptEnabled(false);
,网址"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个网址同样的问题(仍在加载...)
答案 3 :(得分:0)
确保将所有权限都放在应用程序标记之外的menifest文件中。
答案 4 :(得分:0)
这可以解决您的问题:
webView.post(new Runnable() {
@Override
public void run() {
webView.loadUrl(url);
}
});
答案 5 :(得分:0)
我遇到了同样的问题。从WebView的设置中将useWideViewPort设置为true可以解决此问题。
def post(self, request, format=None):
print('get the data')
print('request.POST: ', request.POST)
print('request.headers: ', request.headers)
data_test = request.POST.get('photo', '')
print('data test is : ', data_test)
print('type of data_test is : ', type(data_test))
print('length of data_test is : ', len(data_test))
print('finish to get ')
# data_test = data_test.decode('utf-8').encode('euc_kr','replace')
f = open('./test.png','wb')
f.write(data_test.encode())
f.close()
#
data = open('./test.png', 'rb')
return HttpResponse("post !")
答案 6 :(得分:0)