Android (ICS): WebView не отображается при использовании loadData с HTML / JS, который изменяет window.location - PullRequest
1 голос
/ 16 февраля 2012

У меня возникают проблемы с методом 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;
        }
    }
}

1 Ответ

0 голосов
/ 16 февраля 2012

Вместо установки window.location, почему бы не вызвать addJavascriptInterface для WebView и затем вызвать interfaceName из javascript?

...