У меня возникают проблемы с методом loadData
WebView при передаче определенной полезной нагрузки HTML.Полезная нагрузка содержит некоторый JavaScript, который устанавливает window.location
на URL с пользовательской схемой (mycustomscheme://
в приведенном ниже примере).Причина этого в том, что я хотел бы, чтобы код моего приложения мог перехватывать различные события JS при реализации shouldOverrideUrlLoading
.
На моем устройстве Galaxy Nexus (с Ice Cream Sandwich), shouldOverrideUrlLoading
работает как задумано, но WebView никогда не появляется на экране.Если я удаляю код window.location
из JS, WebView отображается очень хорошо.Код также, кажется, работает правильно на всех устройствах до ICS, которые я пробовал.
Я что-то упускаю из кода, приведенного ниже?
Редактировать: Я мог быиспользуйте addJavascriptInterface
, чтобы выполнить то же самое, но я бы предпочел этого не делать, поскольку не весь HTML-код сгенерирован мной.Чтобы сохранить ясность примера кода, я пропустил эту деталь.
public class ICSWebViewTestActivity extends Activity {
private RelativeLayout mLayout;
private WebView mWebView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLayout = new RelativeLayout(this);
mLayout.setBackgroundColor(Color.RED);
setContentView(mLayout);
mWebView = new WebView(this);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.setBackgroundColor(Color.GREEN);
mWebView.setWebViewClient(new MyWebViewClient());
String data =
"<html><head>" +
"<script>" +
"window.onload = f;" + // works if this line is removed
"function f() { window.location = 'mycustomscheme://finish'; }" +
"</script>" +
"</head>" +
"<body><h1 style='color:blue'>Hello, world!</h1></body>";
mWebView.loadData(data, "text/html", "utf-8");
RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
rlp.addRule(RelativeLayout.CENTER_IN_PARENT);
mLayout.addView(mWebView, rlp);
}
private void doAction() {
Toast.makeText(this, "Doing action!", Toast.LENGTH_SHORT).show();
}
private class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith("mycustomscheme://")) {
doAction();
}
return true;
}
}
}