2015-05-01 7 views
7

Mam prawdziwy problem z uzyskaniem dostępu do appView z najnowszej wersji Cordova na Androida (5.0.0).Dostęp do appView z Cordova 5.0.0

Załóżmy na przykład, że chcę dodać interfejs JavaScript do mojej aplikacji. Przed tą wersją, kiedyś napisać ten wiersz kodu:

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

a następnie WebAppInterface:

public class WebAppInterface { ... } 

Teraz to po prostu nie działa. Czy Cordova coś ostatnio zmieniła? Poważnie nie mam pojęcia, co robić.

W obu przypadkach (poprzednia wersja i nowa), moja główna działalność ma tę strukturę:

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

Super.init uratował mi życie. Moje this.appview zawsze będzie null ..... Dzięki –

Odpowiedz

19

Po dniach szuka rozwiązania, ale w końcu pobrać aplikację do pracy.

Cordova zmieniła sposób dostępu do Androida webView. Programiści korzystający Cordova 5.0.0 i nowsze wersje trzeba dodać tę linię do swojej głównej działalności:

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

A potem, po prostu zadzwoń WV jak zwykle. Na przykład, aby dodać interfejs Javascript:

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

Mam nadzieję, że ta odpowiedź pomoże innym osobom, które nie będą wiedziały o nowej aktualizacji.

+0

Jestem w simliar "uruchom, aby uruchomić po 5 dniach" nastrój :-(W mojej metody onCreate this.appview i super.appview są zerowe. użyj XWalk (przejście dla pieszych), ale myślę, że to tylko kwestia prawidłowego rzucenia widoku, ale w przypadku wartości null nigdzie się nie wybierasz ... Czy to była aplikacja IONIC przez przypadek, bo moja jest. aby uzyskać lepszy wgląd w swoje rozwiązanie: https://github.com/bitflower/IonicXwalkShouldInterceptRequestTest –

+0

Zobacz mój komentarz na główne pytanie: W aplikacji startowej IONIC brakowało super.init() Nie rozumiem tego ponieważ aplikacja z powodzeniem działała bez tego wcześniej. W każdym razie Twój wątek był właściwym wskaźnikiem po 3 dniach .... –

+0

Odlewanie działa dla evaIuateJavascript, ale nie dostaję interfejsu w obiekcie okna. Czy muszę to zrobić w MainActivity lub czy mogę to zrobić w moim kodzie wtyczki (co może być bardziej przydatne)? –

5

Już miałem się poddać, zanim znalazłem twoją odpowiedź, która pomogła mi w powiązanym problemie - dziękuję josemmo.

Może to pomóc innym: Po aktualizacji do Cordova 5/Android 4 nie mogłem dostać shouldOverrideUrlLoading sposobie mojego WebViewClient być uruchomiony, ponieważ ustawienie WebViewClient na nowo utworzonej WebView

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

w metodzie onCreate nie zrobił nic.

więc rozwiązaniem było nie tworzyć nowego WebView, ale korzystać z lanego appView i silnika tak:

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

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

Zwyczaj klasa WebViewClient następnie potrzebuje konstruktor:

public class myWebViewClient extends SystemWebViewClient { 

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

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

I rodzaju wątpliwości, że tak powinno być, ale przynajmniej działa.

Powiązane problemy