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 

3 Solutions collect form web for “Cordova webview dentro de Android Fragment on Cordova 4.0”

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" /> 
  • Recuperar User-Agent mediante programación
  • OnLongClickListener no funciona en WebView
  • No se puede eliminar la imagen en div contenteditable en Android
  • ¿Hay una manera de pasar un mensaje de un navegador de Android a una aplicación?
  • Cómo buscar Android ViewFlipper Ejemplo con varias WebViews
  • ¿Cómo puedo tomar una captura de pantalla de una vista web, capturar la página completa?
  • WebView en un fragmento (android.support.v4)
  • Cargando el caché cuando está sin conexión en la vista Web de Android
  • WebView - no puede descargar el archivo sin solicitarlo dos veces?
  • Carga de archivos en WebView
  • Webview - Mejor manera de subir imágenes desde el dispositivo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.