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
- Diálogo de carga de la vista web de Android
- Jelly Bean WebView no funciona bien con el atributo HTML maxlength para el cuadro de texto
- Colocación de contenido HTML en dos columnas dentro de WebView
- ¿Cómo desactiva webview una vez adjunto?
- Cargar archivo .HTML local con WebView
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
- ¿Cómo descargar archivos de Android de vista web?
- Webview no admite la caja flexible en Android Jellybean
- Android 4.4 dando ERR_CACHE_MISS error en onReceivedError para WebView volver
- ¿Cómo iniciar una actividad de Android cuando se inicia una aplicación PhoneGap?
- WebViewClient que no llama shouldOverrideUrlLoading
- Cómo configurar el zoom / ancho inicial para una vista web
- Enviar solicitud de envío junto con HttpHeaders en Android
- Diseño de página de pago de Paypal roto en webview android
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 hacer que mi administrador de dispositivos de aplicación en android?
- Utilizar una notificación persistente para permitir que el usuario vuelva a ejecutar la aplicación de Android