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" /> 
  • Cómo configurar el tamaño de texto en WebView en android
  • Cómo cargar o recuperar una página web en modo en línea y fuera de línea en la aplicación android?
  • Uso de navigator.geolocation.getCurrentPosition en WebView en Android 2.0+ (relacionado con PhoneGap)
  • WebRTC llega a Android WebView? ¿Cuando?
  • ¿Es posible obtener datos de formularios HTML en android mientras se usa webView?
  • Android, Webview, obtener datos de formulario enviados
  • Superposición azul de OnClick
  • Cómo deshabilitar el teclado virtual en WebView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.