Cordova webview dentro de Android Fragment on Cordova 4.0

Acabo de actualizar a cordova 4.0 para Android. Utilicé el siguiente post para cargar una webview de cordova dentro de un fragmento.

Https://github.com/Adobe-Marketing-Cloud-Apps/app-sample-android-phonegap/wiki/Embed-Webview-in-Android-Fragment

Este código ya no funciona después de actualizar a cordova 4.0 desde 3. *

Específicamente, se lanzará una excepción en esta segunda línea …

LayoutInflater localInflater = inflater.cloneInContext(new CordovaContext(getActivity(), this)); View v = localInflater.inflate(R.layout.dialog_webview, container, false); 

Donde esta etiqueta está en mi archivo de diseño …

  <org.apache.cordova.CordovaWebView android:layout_below="@+id/DialogTopBar" android:layout_width="match_parent" android:layout_height="fill_parent" android:id = "@+id/myWebView" /> 

Mensaje de excepción …

Android.view.InflateException: Línea de archivo XML binario # 43: La clase no es una vista org.apache.cordova.CordovaWebView

¿Alguien tiene alguna idea sobre cómo superar esto?

Se ve como desde cordova 4.0, la clase CordovaWebView se cambió de ..

 public class CordovaWebView extends WebView 

a

 public interface CordovaWebView 

No estoy seguro de si esto es correcto, pero lo conseguí trabajando copiando parte del código del nuevo archivo 4.0 CordovaActivity.java en mi fragmento para configurar el CordovaWebView manualmente.

Paso 1. Quite la etiqueta xml de CordovaWebView en el diseño.

Paso 2. Agregue el siguiente código para fragmentar para crear CordovaWebView manualmente e inyectarlo en el fragmento.

 private CordovaWebView webView; // Read from config.xml: protected CordovaPreferences preferences; protected String launchUrl; protected ArrayList<PluginEntry> pluginEntries; protected CordovaInterfaceImpl cordovaInterface; protected void loadConfig() { ConfigXmlParser parser = new ConfigXmlParser(); parser.parse(getActivity()); preferences = parser.getPreferences(); preferences.setPreferencesBundle(getActivity().getIntent().getExtras()); preferences.copyIntoIntentExtras(getActivity()); launchUrl = parser.getLaunchUrl(); pluginEntries = parser.getPluginEntries(); // Config.parser = parser; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { LayoutInflater localInflater = inflater.cloneInContext(new CordovaContext(getActivity(), this)); View v = localInflater.inflate(R.layout.dialog_webview, container, false); cordovaInterface = new CordovaInterfaceImpl(getActivity()); if(savedInstanceState != null) cordovaInterface.restoreInstanceState(savedInstanceState); loadConfig(); webView = new CordovaWebViewImpl(CordovaWebViewImpl.createEngine(getActivity(), preferences)); webView.getView().setId(100); RelativeLayout.LayoutParams wvlp = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.FILL_PARENT); wvlp.addRule(RelativeLayout.BELOW,R.id.DialogTopBar); webView.getView().setLayoutParams(wvlp); if (!webView.isInitialized()) { webView.init(cordovaInterface, pluginEntries, preferences); } cordovaInterface.onCordovaInit(webView.getPluginManager()); // webView = (SystemWebView)v.findViewById(R.id.myWebView); // Config.init(getActivity()); ((RelativeLayout)v).addView(webView.getView()); } 

Tuve el mismo problema y lo he resuelto como muestra a continuación. En el primer ejemplo, inserto un CordovaWebView dentro de una actividad. Tenga cuidado con cordova 4.0 no podemos incluir un CordovaWebView dentro de nuestros diseños, por lo que en CordovaWebView CordovaWebView extiende versiones anteriores CordovaWebView, pero desde Córdoba 4 esta es una interfaz, por lo que tenemos que incluir un org.apache.cordova.engine.SystemWebView. Si ve el código, puede ver que tiene que anular los métodos makeWebView () y createViews () que se llaman a través de super.init ().

Ejemplo 1: Córdoba dentro de una actividad

MainActivity.java

 public class MainActivity extends CordovaActivity{ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); super.init(); // Load your application launchUrl = "file:///android_asset/www/index.html" loadUrl(launchUrl); } @Override protected CordovaWebView makeWebView() { SystemWebView webView =SystemWebView)findViewById(R.id.cordovaWebView); return new CordovaWebViewImpl(new SystemWebViewEngine(webView)); } @Override protected void createViews() { appView.getView().requestFocusFromTouch(); } } 

Activity_main.xml:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <org.apache.cordova.engine.SystemWebView android:id="@+id/cordovaWebView" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> 

He encontrado una manera de hacer esto aquí: http://www.catharinegeek.com/embed-cordova-webview-in-android-native-app/

El truco está usando SystemWebView en la disposición xml

  <org.apache.cordova.engine.SystemWebView android:id="@+id/cordovaView" android:layout_width="match_parent" android:layout_height="match_parent" /> 
  • PictureListener y onNewPicture () están obsoletos - Alternativas?
  • No navegue a otras páginas de WebView, deshabilite vínculos y referencias
  • WebView en Galería deteniendo eventos de desplazamiento / toque
  • Cómo reproducir video en Android Web view usando html5
  • Incluya algunas páginas en una página en JQuery móvil
  • Guardar imagen desde WebView
  • Android - Cómo convertir la imagen de webview.capturePicture () a byte y de nuevo a bitmap
  • Android - Utilice OkHttp con Webview
  • Forzar el no-flash Vimeo incrustar o deshabilitar Flash en un WebView?
  • Cambiar el color de arrastrar cursor del cuadro de entrada de webview de android
  • Mi aplicación Android de HTML está perdiendo valores almacenados en localStorage cuando se cierra. ¿Alguien más ve este problema?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.