gpt4 book ai didi

Android Phonegap 和 fragment

转载 作者:太空宇宙 更新时间:2023-11-03 12:10:19 25 4
gpt4 key购买 nike

我正在尝试将 Phonegap CordovaWebView 实现到我的 Fragment 中,但它不起作用。

我的布局如下所示 (cordovawebview.xml):

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">

<org.apache.cordova.CordovaWebView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id = "@+id/mainView"/>

</FrameLayout>

在我的 Fragment 的 onCreateView() 中,我尝试膨胀布局:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {

View v = inflater.inflate(R.layout.cordovawebview, container); // <--- the error occurs here!
// CordovaWebView webView = (CordovaWebView)v.findViewById(R.id.mainView);

return v;
}

也许有人有一些提示如何修复它。我总是得到这个错误:

10-25 15:52:02.839: ERROR/AndroidRuntime(2878): FATAL EXCEPTION: main
android.view.InflateException: Binary XML file line #21: Error inflating class org.apache.cordova.CordovaWebView
at android.view.LayoutInflater.createView(LayoutInflater.java:613)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:687)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
at com.advantageframework.tabs.fragments.SampleFragmentA.onCreateView(SampleFragmentA.java:81)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:871)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1083)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:635)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1431)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:420)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.constructNative(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
at android.view.LayoutInflater.createView(LayoutInflater.java:587)
... 19 more
Caused by: java.lang.NullPointerException
at org.apache.cordova.CordovaWebView.loadConfiguration(CordovaWebView.java:643)
at org.apache.cordova.CordovaWebView.<init>(CordovaWebView.java:131)
... 22 more

最佳答案

我找到了答案。如果您查看您的 logcat,您会看到它试图将 Context 转换为 CordovaInterface。上下文是 Activity 。那里失败了。您可能将 Fragment 设为 CordovaInterface。那就是我所做的。您必须将 Activity 设为 CordovaInterface 并将事件(onMessage,...)从 Activity 转发到 Fragment。

这是我的 Activity (删除了一些内容以使其更简单)。我有一些非常接近这个的东西,效果很好。之后您仍然会遇到一些小问题,但这些问题很容易解决。

public class MyCordovaActivity extends SherlockFragmentActivity implements
CordovaInterface {
private final ExecutorService mThreadPool = Executors.newCachedThreadPool();
private CordovaPlugin mActivityResultCallback;

private CordovaFragment mFragment;

@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.nbu_web_activity);
mFragment = new CordovaFragment();
getSupportFragmentManager().beginTransaction()
.add(R.id.fragment, mFragment)
.commit();

// TODO this value you could pass to the activity with a intent extra
// or allow to do this through a seperate function, ...
String url = "http://....";
mFragment.loadUrl(url);
}

@Override
protected void onNewIntent(final Intent intent) {
super.onNewIntent(intent);
NBUGapFragment fragment = getCordovaFragment();
if (fragment != null && fragment.appView != null) {
fragment.appView.onNewIntent(intent);
}
}

@Override
public void onBackPressed() {
NBUGapFragment fragment = getCordovaFragment();
if (fragment == null || !fragment.onBackPressed()) {
super.onBackPressed();
}
}

@Override
public void cancelLoadUrl() {
getCordovaFragment().cancelLoadUrl();
}

@Override
public Activity getActivity() {
return this;
}

@Override
public Context getContext() {
return this;
}

@Override
public ExecutorService getThreadPool() {
return mThreadPool;
}

@Override
public Object onMessage(final String id, final Object data) {
return getCordovaFragment().onMessage(id, data);
}

@Override
public void setActivityResultCallback(final CordovaPlugin plugin) {
mActivityResultCallback = plugin;
}

@Override
public void startActivityForResult(final CordovaPlugin plugin, final Intent intent,
final int requestCode) {
mActivityResultCallback = plugin;
startActivityForResult(intent, requestCode);
}

@Override
protected void onActivityResult(final int requestCode, final int resultCode, final Intent intent) {
if (mActivityResultCallback != null) {
mActivityResultCallback.onActivityResult(requestCode, resultCode, intent);
} else {
super.onActivityResult(requestCode, resultCode, intent);
}
}

private CordovaFragment getCordovaFragment() {
// the CordovaFragment is the one implementing CordovaInterface
return mFragment;
}
}

关于Android Phonegap 和 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13070205/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com