ウェブビュー、いくつかのボタンを使用し、CMSへのjavascript呼び出しに依存する、比較的単純なiOSアプリのAndroidバージョンを作成しようとしています。
しかし、私は開発のかなり早い段階で立ち往生しています:webviewはjavascriptで機能しません。Android webviewでJSを有効にする方法に関する多くの記事を読みましたが、これまでのところ運はありません。
以下は私のコードの一部です:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mWebView = (WebView) findViewById(R.id.webview);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.setWebChromeClient(new WebChromeClient());
mWebView.setWebViewClient(new HelloWebViewClient()
{
@Override
public void onPageFinished(WebView view, String url)
{
//Calling an init method that tells the website, we're ready
mWebView.loadUrl("javascript:m2Init()");
page1(mWebView);
}
});
mWebView.loadUrl("http://my_url/mobile/iphone//app.php");
}
private class HelloWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
mWebView.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
public void page11(View view)
{
mWebView.loadUrl("javascript:m2LoadPage(1)");
}
ここで何が間違っていますか?このURLは、iOSアプリとブラウザーで完全に機能しています。しかし、私のアプリではありません!
明らかなことだと教えてください...
一定!エラーに拍車がかかり、設定する必要があることがわかりました
setDomStorageEnabled(true)
ウェブビュー設定用。
ご協力ありがとうございますステファン:)
AndroidでWebViewが動作しない場合、これらのクレイジーフラグを次のように設定するように常に心がけています。
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setDomStorageEnabled(true);
webSettings.setLoadWithOverviewMode(true);
webSettings.setUseWideViewPort(true);
webSettings.setBuiltInZoomControls(true);
webSettings.setDisplayZoomControls(false);
webSettings.setSupportZoom(true);
webSettings.setDefaultTextEncodingName("utf-8");
なぜこれらはデフォルトでは設定されていないのだろうか、最近はJavaScriptコンテンツのないWebページを期待し、DOMが指定されていない場合はJavaScriptが有効になっていることを期待しています。誰かがすでにバグまたは改善/機能リクエストとしてこれを提出し、サルがそれに取り組んでいることを願っています。
そして、次のように、どこかで腐った非推奨のものがあります:
webView.getSettings().setPluginState(PluginState.ON);
これらはすべて、アプリ内にWebページをロードするためのものです。
IOSでは、非常にシンプルです-Swift 3.0
private func openURLWithInAppBrowser(urlString:String) {
guard let url = URL(string:urlString) else {
return
}
let sfSafari = SFSafariViewController(url:url)
present(sfSafari, animated: true, completion: nil)
}
WebViewでJavaScriptをロードする
webView.getSettings().setDomStorageEnabled(true);
マニフェストで適切なインターネット許可を有効にしましたか?それ以外はすべて正常に見えます。偶然にも、実際のAndroid電話?そしてエミュレーターだけでなく?
ここに、わずかに異なるアプローチに関する 良いチュートリアル があります。あなたはそれがあなたのために働くかどうか見るためにそれを試してみたいかもしれません。
このビデオ( http://youtu.be/uVqp1zcMfbE )は、動作させるためのヒントをくれました。重要なのは、html
およびjs
ファイルをAndroid assets/
フォルダ。その後、次の方法で簡単にアクセスできます。
webView.loadUrl("file:///Android_assets/your_page.html");
WebViewを許可するだけで、JSを実行できます。
WebView web=(WebView)findViewById(R.id.web);
web.getSettings().setJavaScriptEnabled(true);
Kotlinにいる場合、このメソッドを使用してJavaScriptを機能させることができます。
webView.apply {
loadUrl(
"file:///Android_asset/frm/my_html_landing_page_here.html"
)
settings.javaScriptEnabled = true
settings.domStorageEnabled = true
}
また、フォルダー全体がAssetsフォルダー内にあることを確認します(これには、html、javascript、およびその他の必要なファイルが含まれます)
乾杯。
MainActivity.Javaに次のコード行を追加
Jsを有効にするのに役立ちました
webSetting.setJavaScriptEnabled(true);
webView.setWebChromeClient(new WebChromeClient());
webView.setWebViewClient(new WebViewClient());
androidManifestファイルでのこの許可を忘れないでください。
<uses-permission Android:name="Android.permission.INTERNET" />
WebViewでJavaScriptポップアップを有効にするには、webChromeClientを設定し、openFileChooserメソッドをオーバーライドする必要があります。
mWebview.setWebChromeClient(new WebChromeClient(){
// For Android 4.1+
@SuppressWarnings("unused")
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
mUploadMessage = uploadMsg;
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType(acceptType);
startActivityForResult(Intent.createChooser(i, "SELECT"), 100);
}
// For Android 5.0+
@SuppressLint("NewApi")
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
if (mUploadMessageArr != null) {
mUploadMessageArr.onReceiveValue(null);
mUploadMessageArr = null;
}
mUploadMessageArr = filePathCallback;
Intent intent = fileChooserParams.createIntent();
try {
startActivityForResult(intent, 101);
} catch (ActivityNotFoundException e) {
mUploadMessageArr = null;
Toast.makeText(activity,"Some error occurred.", Toast.LENGTH_LONG).show();
return false;
}
return true;
}
});
そして以下のようにonActivityResultを処理します:
@SuppressLint("NewApi")
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 100) {
if (mUploadMessage == null) return;
Uri result = data == null || resultCode != Activity.RESULT_OK ? null : data.getData();
mUploadMessage.onReceiveValue(result);
mUploadMessage = null;
}
else if (requestCode == 101) {
if (mUploadMessageArr == null) return;
mUploadMessageArr.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, data));
mUploadMessageArr = null;
}
}