2015-05-01 5 views
7

Sto avendo problemi reali per accedere a appView dall'ultima versione di Cordova per Android (5.0.0).Accesso a appView da Cordova 5.0.0

Ad esempio, supponiamo di voler aggiungere un'interfaccia Javascript alla mia app. Prima di questa versione, che ho usato per scrivere questa riga di codice:

super.appView.addJavascriptInterface(new WebAppInterface(this), "jsInterface"); 

E poi il WebAppInterface:

public class WebAppInterface { ... } 

Ora, semplicemente non funziona. Cordova ha cambiato qualcosa di recente? Non ho seriamente idea di cosa fare.

In entrambi i casi (versione precedente e nuovo), la mia attività principale ha questa struttura:

public class CordovaApp extends CordovaActivity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     super.init(); 
     loadUrl(Config.getStartUrl()); 
     ... 
} 
+0

il super.init mi ha salvato la vita. Il mio this.appview sarebbe sempre nullo ..... Grazie –

risposta

19

Dopo giorni alla ricerca di una soluzione, ho finalmente l'applicazione per funzionare.

Cordova ha cambiato il modo di accedere ad Android webView. Gli sviluppatori che utilizzano Cordova 5.0.0 e versioni più recenti bisogno di aggiungere questa linea alla loro attività principale:

WebView wV = (WebView)appView.getEngine().getView(); 

E poi, basta chiamare wV come al solito. Ad esempio, per aggiungere un'interfaccia JavaScript:

wV.addJavascriptInterface(new WebAppInterface(this), "jsInterface"); 

Spero che questa risposta sarà aiutare altre persone che sono confusi su questo nuovo aggiornamento.

+0

Sono in uno stato d'animo simile a "get this to run after 5 days" :-(Nel mio metodo onCreate this.appview e super.appview sono nulli. usa XWalk (Crosswalk) ma pensa che questa sia solo una questione di gettare correttamente la webview.Ancora con un null non vai da nessuna parte .... Era un'app IONIC per caso perche 'il mio e'. per avere un po 'più informazioni sulla soluzione: https://github.com/bitflower/IonicXwalkShouldInterceptRequestTest –

+0

Vedere il mio commento sulla domanda principale: Il super.init() mancava nell'app Ionic Starter. in quanto l'app è stata eseguita correttamente senza prima.Tuttavia, il tuo thread era il puntatore giusto dopo 3 giorni .... –

+0

Il casting funziona per evaIuateJavascript, ma non ottengo l'interfaccia nell'oggetto della finestra. Devo farlo nel MainActivity o posso farlo nel mio codice plugin (che risulterebbe più utile)? –

5

Stavo per mollare prima di trovare la tua risposta, che mi ha aiutato in un problema correlato - grazie a josemmo.

Forse questo aiuterà gli altri: Dopo l'aggiornamento a Cordova 5/Android 4 non ho potuto ottenere lo shouldOverrideUrlLoading-Metodo della mia WebViewClient per essere attivato, perché l'impostazione del WebViewClient su una WebView appena creato

WebView webView = new WebView(this); 
webView.setWebViewClient(new WebViewClient()); 

nel metodo onCreate non ha fatto nulla.

Quindi la soluzione era quella di non creare una nuova WebView, ma di utilizzare l'APPVIEW fuso e il motore in questo modo:

SystemWebViewEngine systemWebViewEngine = (SystemWebViewEngine) appView.getEngine(); 
WebViewClient myWebViewClient = new myWebViewClient(systemWebViewEngine); 

WebView webView = (WebView) systemWebViewEngine.getView(); 
webView.setWebViewClient(myWebViewClient); 

La classe WebViewClient personalizzato quindi ha bisogno di un costruttore:

public class myWebViewClient extends SystemWebViewClient { 

    public myWebViewClient(SystemWebViewEngine systemWebViewEngine) { 
     super(systemWebViewEngine); 
    } 

    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     ... 
    } 
} 

I il dubbio che sia così che dovrebbe essere fatto, ma almeno funziona.

Problemi correlati