Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cordova webview inside Android Fragment on Cordova 4.0

I just upgraded to cordova 4.0 for android. I used the following post to load a cordova webview inside a fragment..

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

This code no longer works after upgrading to cordova 4.0 from 3.*

Specifically, an exception is throw on this 2nd line...

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

Where this tag is in my layout file...

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

Exception message...

android.view.InflateException: Binary XML file line #43: Class is not a View org.apache.cordova.CordovaWebView

Does anyone have any ideas on how to get around this?

It does look like since cordova 4.0, the CordovaWebView class was changed from..

public class CordovaWebView extends WebView

to

public interface CordovaWebView
like image 845
TWilly Avatar asked May 27 '15 17:05

TWilly


People also ask

Does Cordova use Android WebView?

Starting with Cordova 1.9, the Android platform relies on a CordovaWebView component, which builds on a legacy CordovaActivity component that pre-dates the 1.9 release.

How does Cordova WebView work?

You can think of the web view as a tab in a browser. When you compile a Cordova application, it doesn't actually take your HTML, CSS, and JavaScript code and automagically converts it into native code, specific to each platform. Cordova acts as a container for the app that you write using web technologies.

What browser does Cordova use?

1. I figured out that Cordova is not using the Chrome App as browser. Instead it is using the browser integrated in the "Android System WebView" app, which is updatable in Google Play Store. Actually it is Chrome, but a different version from the Chrome App.


1 Answers

Not sure if this is correct, but I got it working by copying some of the code from the new 4.0 CordovaActivity.java file into my fragment to setup the CordovaWebView manually.

Step 1. Remove CordovaWebView xml tag in layout.

Step 2. Add in following code to fragment to manually create CordovaWebView and inject it into fragment.

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());
}
like image 123
TWilly Avatar answered Oct 16 '22 03:10

TWilly