- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有两个 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/
我有一个建立异步连接的 Activity ,如下所示: new Thread(new Runnable() { public void run() {
我在 Android 应用程序上有一个 Activity ,该 Activity 启动与我的服务器的同步进程。此过程消耗大量内存和处理,需要一些时间才能完成。 该过程完成后,将向用户显示一个 Aler
自从转移到 androidx 后开始在 Android 7.1 上出现 BadTokenException。它应该是 7.1 中 Toast 的一个已知错误 link但我不太确定,因为它是在我转向 a
我正在尝试在 API 25 中运行我的应用程序,但是当我点击按钮时出现此错误: E/ACRA: ACRA caught a BadTokenException for com.safa.visit.t
当我运行我的代码时,我得到这个错误: : E/InputEventReceiver(1363): Exception dispatching input event. : E/MessageQ
我正在尝试将进度对话框放在 ListView 的 Click 事件上,如下面的代码所述,但出现错误“WindowManager$BadTokenException:无法添加窗口—— token and
我已经在 Android 市场上发布了一个应用程序。我已经在 HTC 和三星上测试过,它工作正常。但是今天我的应用程序出现了如下错误。 android.view.WindowManager$BadTo
我正在读取 GPS 信息并每 10 秒将其发送到网络。 我正在做的是使用运行我的服务类 GPSTracker 的处理程序 public void startGpsService() {
我已经针对同一问题查找了几个帖子,但似乎无法解决我的问题。我在整个应用程序中都使用了微调器,它们运行良好。当我尝试在弹出窗口中使用微调器时,选择它时出现错误。弹出窗口用于添加引用,我已经声明了一个全局
我正在开发一个包含多个 Activity 和服务的 Android 应用程序。一些 Activity 是在我导入到我的项目中的第 3 方库中定义的,问题是在某些设备上(特别是在三星 Galaxy Ta
我正在开发用于背景视频录制 的应用程序,这就是我使用 WindowManager 的原因,但它对我不起作用。出现以下错误: 08-23 15:38:21.021: E/AndroidRuntime(4
如果我直接在oCreate()中添加showPopupWindow();,会报错: android.view.WindowManager$BadTokenException: Unable to ad
我正在使用 Tabwidget,Tab 的实现方式与 tutorial 中所示的方式相同 “MainActivity -> Activity1 -> Activity2(给定图像)” 现在点击微调器给
我创建了一个显示按钮列表的 PopupWindow。最初,对于我列表中的每个项目,我实现了一个 OnLongClickListener 以在 View 持有者中显示一个 Toast 消息: priva
android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@4
我试图在单击按钮后显示 DatePickerDialog,但是一旦单击按钮,它就会停止应用程序并引发以下异常: 05-06 08:46:00.688 18786-18786/carloscoronad
首先,我很清楚发生此错误是因为我试图通过不是Activity 的Context 调用窗口/对话框。 但是没有任何解决方案。我的要求是;我在普通 JAVA 类的方法中有一个带有自定义样式表的 Dialo
当我的应用程序正在运行时,出现此错误: android.view.WindowManager$BadTokenException: Unable to add window -- token null
我正在尝试创建一个覆盖窗口,但是当我尝试将 View 添加到 WindowManager 时,出现异常。我添加了“SYSTEM_ALERT_WINDOW”权限,并在应用信息中启用了“在其他应用上绘制”
我进行了大量搜索以找到答案,但仍然不知道我做错了什么。我只是尝试将 AutoCompleteTextView 与动态数组适配器一起使用。但它对我不起作用:( 我的 OnCreate 方法如下所示: i
我是一名优秀的程序员,十分优秀!