O alerta de JavaScript não funciona no Android WebView

91

No meu aplicativo estou usando WebViewe no JavaScript alert( )método que estou usando , mas não está funcionando, nenhum pop-up aparece.

no meu arquivo de manifesto eu adicionei

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

e no arquivo de atividade eu adicionei

mWebView = (WebView) findViewById(R.id.webview);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.loadUrl("file:///android_asset/demo.html");

No arquivo de layout xml eu adicionei

<WebView 
    android:id="@+id/webview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
/>

Alguma pista de como habilitar full JavaScriptin WebView?


Atualizar

Obrigado, marque
o alert()método no htmlarquivo estão funcionando agora :).

Agora, existem dois problemas WebView:
1: Estou usando um <textarea>no arquivo html que estou carregando WebViewe tentando escrever em uma fonte do idioma hindi, mas quando tento escrever um texto em hindi, ele é exibido como símbolos (símbolos de retângulo como []).

quando eu faço o mesmo no navegador firefox no desktop, ele funciona bem. alguma pista de como dar suporte para vários idiomas textareaem WebView?

2: Quando estou clicando em enviar e tentando abrir o valor do texto no alert()método em outro script java ele não funciona, significa que mesmo depois de usar o WebChromeClient seu aplicável apenas para a página html carregada atual e não javascriptschamado dessa página?

user655192
fonte
6
É "JavaScript", não "Java Script", "java-script" ou "Java script" (todos apareceram em sua pergunta original). Eu corrigi para você.
TJ Crowder
3
@TJCrowder Eu ousaria dizer que deveria se chamar Javascript .
Kris Selbekk
7
@KrisSelbekk: Não. :-) "JavaScript" é uma marca registrada da Oracle (gotta love fusões e aquisições), e usada (com permissão) pela Mozilla para sua implementação. Em ambos os casos, com S maiúsculo. Essa é a única forma normativa desse nome. O outro nome para o idioma, é claro, é ECMAScript (ou ES), mas ninguém realmente o usa, exceto quando se fala em ES5 .
TJ Crowder

Respostas:

89

Verifique este link e último comentário, você tem que usar WebChromeClientpara o seu propósito.

Sentou
fonte
8
obrigado! webView.setWebChromeClient (new WebChromeClient () {@Override public boolean onJsAlert (visualização WebView, String url, String mensagem, JsResult result) {return super.onJsAlert (view, url, message, result);}});
nurnachman
seu comentário me ajudou .. assim como a resposta do Nikhil abaixo.
Vamsi Challa
Funciona como charme. Mas então ... o WebClient tem alguma vantagem sobre o WebChromeClient.
Josh
3
Pode ser uma pergunta estúpida, mas de qualquer forma: por que substituir um método para chamar apenas o método de um super com os mesmos parâmetros?
Dmitry Andrievsky
1
Não se esqueça de adicionarwebview.getSettings().setJavaScriptEnabled(true);
Jemshit Iskenderov
119

Como outros indicaram, a configuração do WebChromeClient é necessária para começar alert()a trabalhar. Basta definir o padrão WebChromeClient ():

mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.setWebChromeClient(new WebChromeClient());

Obrigado por todos os comentários abaixo. Incluindo John Smith, que indicou que você precisava habilitar o JavaScript.

Stephen Quan
fonte
sim, mas na maioria das vezes você quer ajustar os eventos do WebChromeClient então ...
Radu Simionescu
10
Eu finalmente consegui fazer funcionar adicionando mWebView.getSettings().setJavaScriptEnabled(true);antes da linhamWebView.setWebChromeClient(new WebChromeClient());
John Smith Opcional
2
Não se esqueça de adicionarwebview.getSettings().setJavaScriptEnabled(true);
Jemshit Iskenderov
22
webView.setWebChromeClient(new WebChromeClient() {
    @Override
    public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
        return super.onJsAlert(view, url, message, result);
    }
});
Nikhil Dinesh
fonte
Isso funciona muito bem, mas quando eu chamo promptde javascript, em vez de exibir o texto do prompt diz: "A página em https: // ... diz:" quebrando totalmente a imersão do WebView sendo incorporado ao aplicativo
Michael
5

O seguinte código funcionará:

private WebView mWebView;
final Activity activity = this;

// private Button b;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mWebView = (WebView) findViewById(R.id.webview);
    mWebView.getSettings().setJavaScriptEnabled(true);
    mWebView.getSettings().setDomStorageEnabled(true);
    mWebView.setWebChromeClient(new WebChromeClient() {
        public void onProgressChanged(WebView view, int progress) {
            activity.setProgress(progress * 1000);
        }
    });

    mWebView.loadUrl("file:///android_asset/raw/NewFile1.html");
}
user1645162
fonte
0

Você pode tentar com isso, funcionou para mim

WebView wb_previewSurvey=new WebView(this); 


       wb_previewSurvey.setWebChromeClient(new WebChromeClient() {
        @Override
        public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
            //Required functionality here
            return super.onJsAlert(view, url, message, result);
        }

    });
Tarit Ray
fonte
0

se você deseja ocultar o URL do usuário, mostre um AlertDialog como abaixo.

myWebView.setWebChromeClient(new WebChromeClient() {

            @Override
            public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
                Log.d(TAG, "onJsAlert url: " + url + "; message: " + message);
                AlertDialog.Builder builder = new AlertDialog.Builder(
                        mContext);
                builder.setMessage(message)
                        .setNeutralButton("OK", new OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int arg1) {
                                dialog.dismiss();
                            }
                        }).show();
                result.cancel();
                return true;
            }
    }
AbhinayMe
fonte