Alert JavaScript nie działa w Android WebView

91

W mojej aplikacji używam WebViewi używam JavaScript alert( )metody, ale nie działa, nie pojawia się wyskakujące okienko.

w moim pliku manifestu, który dodałem

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

iw pliku aktywności, które dodałem

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

W pliku układu xml dodałem

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

Wszelkie pojęcia, jak włączyć pełny JavaScriptin WebView?


Aktualizacja

Dzięki zaznacz,
że alert()metoda w htmlpliku już działa :).

Teraz są dwa problemy WebView:
1: używam <textarea>w pliku html, który ładuję WebView, i próbuję pisać czcionką w języku hindi, ale kiedy próbuję napisać tekst w języku hindi, wyświetla się on jako symbole (symbole prostokątów, takie jak []).

kiedy robię to samo w przeglądarce Firefox na komputerze, działa dobrze. jakieś wskazówki, jak zapewnić obsługę wielu języków textareaw WebView?

2: Kiedy klikam przycisk prześlij i próbuję otworzyć wartość tekstu w alert()metodzie w innym skrypcie java, to nie działa, czy to oznacza, że ​​nawet po użyciu WebChromeClient jej dotyczy tylko aktualnie załadowanej strony html i nie jest javascriptswywoływana z tej strony?

user655192
źródło
6
To „JavaScript”, a nie „Java Script”, „java-script” czy „Java script” (wszystkie pojawiły się w Twoim pierwotnym pytaniu). Poprawiłem to dla ciebie.
TJ Crowder
3
@TJCrowder Zaryzykowałbym stwierdzenie, że powinien nazywać się Javascript .
Kris Selbekk
7
@KrisSelbekk: Nie. :-) „JavaScript” jest zastrzeżonym znakiem towarowym firmy Oracle (trzeba kochać fuzje i przejęcia) i jest używany (za zgodą) przez Mozillę do ich implementacji. W obu przypadkach, z kapitału S. To jedyna normatywna forma tego imienia. Inną nazwą tego języka jest oczywiście ECMAScript (lub ES), ale nikt tak naprawdę go nie używa, z wyjątkiem sytuacji, gdy mówi się o ES5 .
TJ Crowder

Odpowiedzi:

89

Sprawdź ten link i ostatni komentarz, którego musisz użyć WebChromeClientdo swojego celu.

sat
źródło
8
Dziękuję Ci! webView.setWebChromeClient (new WebChromeClient () {@Override public boolean onJsAlert (widok WebView, String url, String message, JsResult result) {return super.onJsAlert (view, url, message, result);}});
nurnachman
Twój komentarz pomógł mi ... tak samo jak odpowiedź Nikhila poniżej.
Vamsi Challa
Działa jak urok. Ale… czy WebClient ma jakąkolwiek przewagę nad WebChromeClient.
Josh
3
Może to być głupie pytanie, ale w każdym razie: po co zastępować metodę, aby wywoływać metodę super tylko z tymi samymi parametrami?
Dmitry Andrievsky
1
Nie zapomnij dodaćwebview.getSettings().setJavaScriptEnabled(true);
Jemshit Iskenderov
119

Jak wskazali inni, do pracy potrzebne jest ustawienie WebChromeClient alert(). Wystarczy ustawić domyślny WebChromeClient ():

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

Dzięki za wszystkie poniższe komentarze. W tym John Smith, który wskazał, że musisz włączyć JavaScript.

Stephen Quan
źródło
tak, ale w większości przypadków chcesz dostosować wydarzenia z WebChromeClient, więc ...
Radu Simionescu
10
W końcu udało mi się to zadziałać, dodając mWebView.getSettings().setJavaScriptEnabled(true);przed wierszemmWebView.setWebChromeClient(new WebChromeClient());
John Smith Opcjonalnie
2
Nie zapomnij dodaćwebview.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
źródło
To działa świetnie, ale kiedy dzwonię promptz javascript, zamiast wyświetlać tekst zachęty, mówi: „Strona pod adresem https: //… mówi:” całkowicie przerywa zanurzenie WebView osadzonego w aplikacji
Michael
5

Poniższy kod zadziała:

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
źródło
0

Możesz spróbować z tym, to zadziałało dla mnie

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
źródło
0

jeśli chcesz ukryć adres URL przed użytkownikiem, Pokaż okno dialogowe AlertDialog, jak poniżej.

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
źródło