gpt4 book ai didi

android.view.WindowManager$BadTokenException 异常。任何指针?

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

我有两个 webview,为了从两个 webview 中删除通用功能,我创建了一个父类(super class),其中包含父类(super class)中的所有方法,并在两个 webview 中使用它。

有一次,当我创建对象并从第一个 web View 设置变量时,Web View 正确显示,当我按下“返回”按钮并转到第二个 Web View 时,我得到以下异常。

有什么帮助吗?

第一个 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);
}

第二个代码与第一个类似,但 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, int errorCode, String description, 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();
}

最佳答案

问题是对话框需要有你的 Activity 的“基本”上下文,不一定是你启动它的上下文。

这是一个经常有效的解决方案

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 然后会显示您所在的 Activity 的层次结构。

关于android.view.WindowManager$BadTokenException 异常。任何指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3516842/

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