博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android 4.0 fragment,Cordova webview inside Android Fragment on Cordova 4.0
阅读量:6376 次
发布时间:2019-06-23

本文共 4847 字,大约阅读时间需要 16 分钟。

问题

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...

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

回答1:

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 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());

}

回答2:

I had the same problem and I have resolved it as show below. In the first example, I embed a CordovaWebView inside an activity. Be careful with cordova 4.0 we can't include a CordovaWebView inside our layouts, so in previous cordova versions CordovaWebView extends WebView but since Cordova 4 this is an interface, so we have to include a org.apache.cordova.engine.SystemWebView. If you see the code you can see that you have to override the methods makeWebView() and createViews() that are called through super.init().

Example 1: Cordova inside an Activity

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:

android:orientation="vertical" android:layout_width="match_parent"

android:layout_height="match_parent">

android:id="@+id/cordovaWebView"

android:layout_width="match_parent"

android:layout_height="match_parent"

/>

回答3:

I found a way to do this here:

http://www.catharinegeek.com/embed-cordova-webview-in-android-native-app/

the trick is using SystemWebView in layout xml

android:id="@+id/cordovaView"

android:layout_width="match_parent"

android:layout_height="match_parent" />

来源:https://stackoverflow.com/questions/30489176/cordova-webview-inside-android-fragment-on-cordova-4-0

转载地址:http://xavqa.baihongyu.com/

你可能感兴趣的文章
221. Maximal Square
查看>>
MySQL基础
查看>>
机器学习A-Z~支持向量机
查看>>
PAT A1010 二分进制结合重点题
查看>>
LeetCode35.搜索插入位置 JavaScript
查看>>
5个让人赞不绝口的微信小程序,拒绝占用手机内存!
查看>>
Spring Security整合KeyCloak保护Rest API
查看>>
POS概述
查看>>
containerd发布了CRI修复程序和CVE-2019-5736更新的runc
查看>>
77. Combinations
查看>>
WEB前端开发的思考与感悟
查看>>
实现了所有主流APP的分类切换效果,可快速接入,灵活扩展(swift)
查看>>
微信自动跳转浏览器打开APP(APK)下载链接
查看>>
==与===的区别
查看>>
机器学习实验笔记
查看>>
不同工具查看代码分支diff的差异
查看>>
一文 | 跨域及其解决方案
查看>>
白话Java I/O模型
查看>>
[TsAdmin]--一款基于Vue.js+Element UI的单页无刷新(无iframe)多选项卡的后台管理系统模板...
查看>>
排列组合技术
查看>>