一旦我创建对象并从第一个webvIEw设置变量,WebVIEw就会正常显示,当我按下“BACK”按钮并转到第二个WebVIEw时,我得到了异常.
有帮助吗?
第一个WebVIEw代码
public class firstWebVIEw extends Activity { private static final String LOG_TAG = "FirstWebVIEw"; public static final int VIDEO_PLAY = 0; private WebVIEw mWebVIEw; private NicuWebVIEw _nicuWebVIEw; private static final String URL = mainMenuActivity.urlSelected+"todo.HTML"; @OverrIDe public voID onCreate(Bundle icicle) { super.onCreate(icicle); setContentVIEw(R.layout.webvIEw); getwindow().setFeatureInt(Window.FEATURE_PROGRESS,Window.PROGRESS_VISIBIliTY_ON); mWebVIEw = (WebVIEw) findVIEwByID(R.ID.webvIEw); _nicuWebVIEw = NicuWebVIEw.getNicuWebVIEw(mWebVIEw);// mWebVIEw.setWebChromeClIEnt(new MyWebChromeClIEnt()); final Activity activity = this; NicuWebVIEw.setContext(activity); setProgressbarVisibility(true); int count = (int) _nicuWebVIEw.loadUrl(URL); Toast.makeText(this,"Count = "+count,Toast.LENGTH_SHORT).show(); }public boolean onKeyDown(int keyCode,KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebVIEw.canGoBack()) {// startActivity(new Intent(getApplication(),mainMenuActivity.class)); mWebVIEw.goBack(); return true; } return super.onKeyDown(keyCode,event); }
Code for Second与第一个类似,但URL指向不同的HTML页面.
E/AndroIDRuntime( 7913): androID.vIEw.WindowManager$BadTokenException: Unable to add window -- token androID.os.BinderProxy@447d2a98 is not valID; is your activity running?E/AndroIDRuntime( 7913): at androID.vIEw.VIEwRoot.setVIEw(VIEwRoot.java:468)E/AndroIDRuntime( 7913): at androID.vIEw.WindowManagerImpl.addVIEw(WindowManagerImpl.java:177)E/AndroIDRuntime( 7913): at androID.vIEw.WindowManagerImpl.addVIEw(WindowManagerImpl.java:91)E/AndroIDRuntime( 7913): at androID.vIEw.Window$LocalWindowManager.addVIEw(Window.java:424)E/AndroIDRuntime( 7913): at androID.app.Dialog.show(Dialog.java:239)E/AndroIDRuntime( 7913): at androID.app.AlertDialog$Builder.show(AlertDialog.java:802)E/AndroIDRuntime( 7913): at androID.webkit.CallbackProxy.handleMessage(CallbackProxy.java:483)E/AndroIDRuntime( 7913): at androID.os.Handler.dispatchMessage(Handler.java:99)E/AndroIDRuntime( 7913): at androID.os.Looper.loop(Looper.java:123)E/AndroIDRuntime( 7913): at androID.app.ActivityThread.main(ActivityThread.java:4363)E/AndroIDRuntime( 7913): at java.lang.reflect.Method.invokeNative(NativeMethod)E/AndroIDRuntime( 7913): at java.lang.reflect.Method.invoke(Method.java:521)E/AndroIDRuntime( 7913): at com.androID.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)E/AndroIDRuntime( 7913): at com.androID.internal.os.ZygoteInit.main(ZygoteInit.java:618)E/AndroIDRuntime( 7913): at dalvik.system.NativeStart.main(Native Method)
NicuWebVIEw的代码是
public class NicuWebVIEw {private static NicuWebVIEw _nicuWebVIEw;private static WebVIEw _webVIEw;private static HashMap<String,Long> _urls;private static Context contextname;private static final int VIDEO_PLAY = 0;private NicuWebVIEw(WebVIEw myWebVIEw) { _urls = new HashMap<String,Long>(10); _webVIEw = myWebVIEw; _webVIEw.setWebVIEwClIEnt(new NicuWebVIEwClIEnt()); _webVIEw.getSettings().setJavaScriptEnabled(true); _webVIEw.clearCache(true); WebSettings webSettings = _webVIEw.getSettings(); webSettings.setSavePassword(true); webSettings.setSaveFormData(true); webSettings.setJavaScriptEnabled(true); webSettings.setSupportZoom(true); _webVIEw.addJavaScriptInterface(new DemoJavaScriptInterface(),"demo"); _webVIEw.clearCache(true); _webVIEw.setWebVIEwClIEnt(new WebVIEwClIEnt() { public voID onReceivedError(WebVIEw vIEw,int errorCode,String description,String failingUrl) { Toast.makeText(contextname,"Super Class TOAST message",Toast.LENGTH_LONG).show(); } @OverrIDe public voID onPageFinished(WebVIEw vIEw,String url) { _webVIEw.loadUrl("JavaScript:(function () { " + "setvariable("+mainMenuActivity.numberSelected+");" + "})()"); } }); _webVIEw.setWebChromeClIEnt(new WebChromeClIEnt() { public voID onProgressChanged(WebVIEw vIEw,int progress) { // ActivitIEs and WebVIEws measure progress with different scales. // The progress meter will automatically disappear when we reach 100% ((Activity) contextname).setProgress(progress * 1000); } }); _webVIEw.setWebVIEwClIEnt(new WebVIEwClIEnt() { public voID onReceivedError(WebVIEw vIEw,String failingUrl) { Toast.makeText(contextname,"Oh no! " + description,Toast.LENGTH_SHORT).show(); } @OverrIDe public voID onPageFinished(WebVIEw vIEw,String url) { _webVIEw.loadUrl("JavaScript:(function () { " + "setvariable("+mainMenuActivity.numberSelected+");" + "})()"); } });} // allow clicking on link to remain in app instead of launching androID browser private class NicuWebVIEwClIEnt extends WebVIEwClIEnt { @OverrIDe public boolean shouldOverrIDeUrlLoading(WebVIEw vIEw,String url) { vIEw.loadUrl(url); return true; } } public static NicuWebVIEw getNicuWebVIEw(WebVIEw myWebVIEw){ if (_nicuWebVIEw == null) _nicuWebVIEw = new NicuWebVIEw(myWebVIEw); return _nicuWebVIEw;} // loads the requested URL and maintains a 'history' of pages visited.// returns number of times page was loaded. public long loadUrl(String url) { long count = incrementCounter(url); _webVIEw.loadUrl(url); return count; } //helper to private static long incrementCounter(String url){ if (url != null) { if (_urls.get(url)==null) _urls.put(url,new Long(0)); long count = _urls.put(url,_urls.get(url) +1L); return count; } else { Toast.makeText(contextname,"Null URL",Toast.LENGTH_SHORT).show(); return 0; } } /// return the number of times the given URL has been visited public long getUrlVisitCount(String url) { if (_urls.get(url)==null) return 0L; return _urls.get(url); } //returns to the prevIoUs URL,returns that URL public String goBack(){ if (_webVIEw.canGoBack()) _webVIEw.goBack(); String url = _webVIEw.getUrl(); incrementCounter(url); return url; } //returns to next forward URL,returns that URL public String goForward(){ if (_webVIEw.canGoForward()) _webVIEw.goForward(); String url = _webVIEw.getUrl(); incrementCounter(url); return url; } public static boolean setContext(Context context) { contextname = context; return true; } public Context getContext(){ if (contextname == null) return null; return contextname; } final class DemoJavaScriptInterface { public voID setPlayVIDeo(String option) { Toast.makeText(contextname,"Playing VIDeo = "+option,Toast.LENGTH_SHORT).show(); Intent intent = new Intent ( contextname,playVIDeo.class ); ((Activity) contextname).startActivityForResult(intent,VIDEO_PLAY); } } public boolean canGoBack() { return _webVIEw.canGoBack(); }
}
@H_301_4@解决方法 问题是对话框需要具有您活动的“基础”上下文,而不一定是您从中启动它的那个.这是一个经常有效的解决方案
Activity a = this;while(a.getParent() != null) { a = a.getParent();}_nicuWebVIEw.setContext(a);
查看正在发生的事情的一种方法是修改该示例,如下所示
Activity a = this;while(a.getParent() != null) { Log.i("ActivityTree",a.getClass().getSimplename()); a = a.getParent();}_nicuWebVIEw.setContext(a);
然后,adb将向您显示您所在的活动层次结构.
@H_301_4@ @H_301_4@ @H_301_4@ @H_301_4@ 总结以上是内存溢出为你收集整理的android.view.WindowManager $BadTokenException异常.任何指针?全部内容,希望文章能够帮你解决android.view.WindowManager $BadTokenException异常.任何指针?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)