Android - 使用应用程序上下文创建 WebView 后如何将其附加到 Activity

2024-04-05

我正在使用应用程序上下文在后台创建一个 Android WebView,以便在我需要显示它时加载并准备好它。当需要时,我使用 addView 将其附加到我的 Activity 中。这通常工作得很好,但是当我尝试打开 HTML 选择下拉列表时,我遇到了崩溃:

android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
  at android.view.ViewRootImpl.setView(ViewRootImpl.java:540)
  at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:259)
  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
  at android.app.Dialog.show(Dialog.java:286)
  at com.android.org.chromium.content.browser.input.SelectPopupDialog.show(SelectPopupDialog.java:217)
  at com.android.org.chromium.content.browser.ContentViewCore.showSelectPopup(ContentViewCore.java:2413)
  at com.android.org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method)
  at com.android.org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:27)
  at android.os.Handler.dispatchMessage(Handler.java:102)
  at android.os.Looper.loop(Looper.java:136)
  at android.app.ActivityThread.main(ActivityThread.java:5017)
  at java.lang.reflect.Method.invokeNative(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:515)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
  at dalvik.system.NativeStart.main(Native Method)

我假设这是因为我使用 ApplicationContext 创建了 WebView。我的问题是:有什么办法可以解决这个问题吗?有没有办法将现有的 WebView“附加”到不同的 Activity 或 Window 以便创建 Dialog?有没有办法通过在运行时更改上下文来使用反射将其“破解”在一起?

编辑:正如下面的建议,我使用一个进行了测试可变上下文包装器 http://developer.android.com/reference/android/content/MutableContextWrapper.html它似乎很好地解决了这个问题!


所以,我们实际上遇到了同样的问题(使用WebView在保留的Fragment以防止页面重新加载,同时不泄漏Activity上下文),简短的回答似乎是没有真正干净的方法来做到这一点。我什至尝试过定制WebView返回主机的子类Activity的窗口令牌而不是WebView自己的令牌,没有成功。

正如您所建议的,我们最终使用反射来修改底层上下文:

public static boolean setContext(View v, Context ctx) {
    try {
        final Field contextField = View.class.getDeclaredField("mContext");
        contextField.setAccessible(true);
        contextField.set(v, ctx);
        return (v.getContext() == ctx);
    } catch (IllegalAccessException | NoSuchFieldException e) {
        Log.e(TAG, String.valueOf(e), e);
        return false;
    }
}

这只是设置mContext场上的View实例,如果修改成功则返回 true。然而,我最近看到了另一个建议(并且我没有测试过这个,所以 YMMV) 使用MutableContextWrapper。所以你会膨胀WebViewActivity Context,包裹在MutableContextWrapper。然后,当您需要释放先前的引用时,您可以将其强制转换WebView's Context to a MutableContextWrapper,然后设置底座Context到新的Activity。所以像这样来膨胀布局:

MutableContextWrapper contextWrapper = new MutableContextWrapper(activity);

WebView webView = (WebView) LayoutInflater.from(contextWrapper)
        .inflate(R.layout.your_webview_layout, theParent, false);

然后,重新连接到新的Activity:

if (webView.getContext() instanceof MutableContextWrapper) {
    ((MutableContextWrapper) webView.getContext()).setBaseContext(newActivity);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android - 使用应用程序上下文创建 WebView 后如何将其附加到 Activity 的相关文章

  • 如何获取之前的碎片?

    为了在我的应用程序中重用某些片段 我需要知道哪个片段是返回堆栈上的第二个片段 为了做到这一点 我正在使用getFragmentManager getFragments 显示以下错误 但有效 FragmentManager getFragme
  • Android 上的 SVG 支持

    Android 支持 SVG 吗 有什么例子吗 最完整的答案是这样的 Android 2 x 默认浏览器本身不支持 SVG Android 3 默认浏览器支持 SVG 要将 SVG 支持添加到 2 x 版本的平台 您有两个基本选择 安装功能
  • 安卓定位不准确

    我正在尝试获取当前用户的位置 我试图重构我的代码以获得更好的结果 但我只是不断得到关于准确度的荒谬位置 它在 900 600 米之间 如何才能得到更好的结果 使其精度达到50m以内 这是我的代码 package com agam mapsl
  • 播放 SoundCloud 曲目

    我可以在 Android 应用程序中播放 SoundCloud 中的曲目吗 我正在尝试这段代码 但它不起作用 String res https api soundcloud com tracks 84973999 stream client
  • 如何在android上的python kivy中关闭应用程序后使服务继续工作

    我希望我的服务在关闭应用程序后继续工作 但我做不到 我听说我应该使用startForeground 但如何在Python中做到这一点呢 应用程序代码 from kivy app import App from kivy uix floatl
  • Android在排序列表时忽略大小写

    我有一个名为路径的列表 我目前正在使用以下代码对字符串进行排序 java util Collections sort path 这工作正常 它对我的 列表进行排序 但是它以不同的方式处理第一个字母的情况 即它用大写字母对列表进行排序 然后用
  • 如何为发布而不是调试创建密钥库?扑

    我按照使用此网站部署 flutter 的步骤进行操作https flutter io android release https flutter io android release 当我运行 flutter build apk 时出现此错
  • 使用 Retrofit2 和 Mockito 或 Robolectric 进行 Android 单元测试

    我可以测试 Retrofit2beta4 的真实响应吗 我需要 Mockito 或 Robolectic 吗 我的项目中没有活动 它将是一个库 我需要测试服务器是否正确响应 现在我有这样的代码并卡住了 Mock ApiManager api
  • 放置在 NavigationDrawer 顶部的片段

    我正在尝试添加一个PreferenceFragment在我的应用程序中 问题是 它自动放置在我的顶部NavigationDrawer public class SetPreferenceActivity extends Activity O
  • 使用 gradlew assembleRelease 从 React Native 创建发布 apk 时出现错误

    我想发布 apk 但我收到错误 文件已存在 mkdir D mobile 它在 d 驱动器中生成名为 mobile 的文件 删除文件后 再次执行 gradlew assembleRelease 创建该文件并抛出错误 任务 app bundl
  • 如何检查 Android 中连接的 wifi 网络是否处于活动状态

    如何自动检查android中连接的WiFi网络上的互联网是否处于活动状态 我可以检查 wifi 是否已启用或 wifi 网络是否已连接 但我不确定如何检查互联网是否已连接 这可能吗 private boolean connectionAva
  • 菜单在片段的 onCreateOptionsMenu 处多次膨胀调用

    我使用 Fragments 当我切换到嵌套 Fragment 时 它实现了public void onCreateOptionsMenu Menu menu MenuInflater inflater 当我到达该嵌套片段时 我的菜单会多次膨
  • 在游戏视图下添加 admob

    我一直试图将 admob 放在我的游戏视图下 这是我的代码 public class HoodStarGame extends AndroidApplication Override public void onCreate Bundle
  • Android 后台服务示例,具有交互式调用方法

    我不是 Android 方面的专家 我正在寻找一个 Android 应用程序的示例 该应用程序使用一个服务 其中有真正的功能方法 或者换句话说 一个服务可以用来做什么 我们什么时候需要它 超越简单的东西服务举例 我确信您渴望获得一些工作代码
  • 有关 ListView 自定义行布局项目上的 onClick() 事件的帮助

    我有一个 ListView 其行由我格式化 每行都有 ImageView 和 TextView 的混合 我还实现了自己的适配器 并且能够通过它绘制每一行 现在 我想要这样的东西 用户单击 ImageView 不是行上的其他任何位置 但只有此
  • 如何修改 Skobbler 注释而不重新添加它

    我必须修改 SKAnnotation 的图像 注释生成器代码 private SKAnnotation getAnnotationFromView int id int minZoomLvl View view SKAnnotation a
  • Android 中循环事件的星期几和时间选择器

    我想创建一个控件 允许用户在我的 Android 活动中选择一周中的某一天 星期一 和一天中的某个时间 下午 1 00 找不到任何关于此的好帖子 好吧 我想我已经明白了 我只是不喜欢这个解决方案 因为我在一周中的某一天使用的微调器与时间选择
  • 如何在基本活动中使用 ViewBinding 的抽象?

    我正在创建一个基类 以便子级的所有绑定都将设置在基类中 我已经做到了这一点 abstract class BaseActivity2 b AppCompatActivity private var viewBinding B null pr
  • 如何在片段中实现 onBackPressed() 和意图?

    我知道 onBackPressed 是活动中的一种方法 但是 我想在片段中使用该功能 以便当按下后退按钮时 它会通过 Intent 重定向到另一个活动 有什么办法解决这个问题吗 public class News Events fragme
  • Android 材料芯片组件崩溃应用程序。无法膨胀 xml

    Tried Chip来自两个支持库的组件 com google android support design 28 0 0 rc01和材料 com google android material material 1 0 0 rc01 堆栈

随机推荐

  • 行计数 C++

    我正在处理程序中的逻辑行数 省略注释和黑线 计数线正在工作 但我不知道如何省略注释行 我尝试 if line comment 但它只检查以以下开头的行 如果旁边有文本 则不会将其视为注释行 最后当我知道总行数和总注释行数时 我会减去tota
  • FBSDKLoginManager logInWithPublishPermissions 始终返回 isCancelled=YES

    我无法弄清楚如何让用户登录我的应用程序 FBSDKAccessToken currentAccessToken 为零 所以我打电话 FBSDKLoginManager alloc init logInWithPublishPermissio
  • 任何自动更新页面所有帖子时间的 jquery 插件

    我有一个页面 其中有很多帖子 显示它们发布的时间 我想每 1 分钟后继续更新该时间 一种简单的方法可以给它们一个相同的类 并在 1 分钟后获取所有元素并更新时间 有什么更好的解决方案 您可以使用像这样的简单插件 fn UpdateSince
  • 基数排序如何工作?

    我不知道为什么这对我来说如此难以理解 我浏览了 wiki 页面和伪代码 以及实际代码 试图了解基数排序算法的工作原理 相对于存储桶 我在这里寻找错误的东西吗 我应该研究桶排序吗 有人能给我一个简化版本的工作原理吗 作为参考 这里是一个代码块
  • 当 ListView 项可见或不可见时获取事件

    我想知道 ListView 中的视图是否有某种 OnVisibilyChangeListener 因为我希望每次 ListView 项更改其可见性时都调用一个方法 我知道 OnPreDrawListener 来检查视图是否可见 但是我如何检
  • 如何在ansible中为变量分配随机数?

    这是一个 ansible 脚本 我希望它能打印出相同的随机数 3 次 相反 它打印出三个随机数 如何将随机数分配给 ansible 中的变量 以便它在整个剧本中固定 name Test random filter hosts localho
  • 为什么“this.setState”不起作用?

    我正在从 API 端点获取 JSON 数据 并希望使用此数据来显示表格 这是我目前正在尝试的 var DeliveryOptionsTHeadTh React createClass render function return th th
  • 焦点问题集中在表单加载上

    我有一个 ActiveX 控件 可能是用 VB 6 0 或 C 编写的 我们在 C WinForms 程序中将其用作 AxInterop 它非常像一个文本框 但具有一些特殊的逻辑等 我们已将其添加到工具栏 当表单加载时 我希望键盘焦点位于该
  • 传输安全已阻止明文 HTTP

    我需要在我的info plist根据以下错误消息启用 HTTP 模式 传输安全已阻止明文 HTTP http 资源 加载 因为它不安全 可以通过以下方式配置临时例外 您应用程序的 Info plist 文件 假设我的域名是example c
  • 从给定日期中提取日、月和年的最快方法是什么?

    我将包含 150 000 行的 csv 文件读取到 pandas 数据框中 该数据框有一个字段 Date 日期为yyyy mm dd格式 我想从中提取月 日和年并将其复制到数据框的列中 Month Day and Year分别 对于几百条记
  • 对 Groupby 组内的 Pandas 数据框数据进行排序

    我有一个大的 pandas 数据框 其结构可以表示为 id date status 0 12 2015 05 01 0 1 12 2015 05 22 1 2 12 2015 05 14 1 3 12 2015 05 06 0 4 45 2
  • 我应该在removeChild之前从元素中删除事件处理程序吗?

    假设我有一个元素 img 并附加了一些事件 例如click 不是内联的onclick somewhere i wrote foo addEventListener click clickHandler false somewhere i w
  • Application Insights 未在 Azure 预览门户中显示数据

    我在 Azure 上有一个现有的 Web 应用程序 其中有一些非常有限的应用程序洞察监控 端点检查 我想我会引入其余的功能 所以我按照以下说明将遥测添加到我的项目中http azure microsoft com en us documen
  • 如何将 Visual Studio 2010 SP1 解决方案转换为 Visual Studio 2012 解决方案? [复制]

    这个问题在这里已经有答案了 我知道它们 大多数项目类型 在 2010 SP1 和 2012 之间是相互兼容的 并且没有必要进行转换 但是如果我仍然需要它怎么办 如果我需要将我的解决方案标记为 Visual Studio 2012 解决方案该
  • 在 Xcode 中使用 git 时 UserInterfaceState.xcuserstate 未提交

    当我尝试提交代码项目时 它显示一个名为 UserInterfaceState xcuserstate 的文件 必须提交该文件 一旦我提交并尝试将我的项目推送到 git Xcode 就会弹出一条消息 提示 工作副本 app 有未提交的更改 当
  • 使用 bxslider 时图像上没有箭头

    我刚刚了解了 bxslider 并通过阅读文档制作了我的第一个幻灯片 但我看不到图像上的左右箭头 因此可以通过单击显示下一张图像如以下示例所示 这个链接 http bxslider com examples image slideshow
  • 我怎样才能为基础 R 做出小小的贡献?

    偶尔我会看到一些可以改进 R 最近是 IQR 命令 和 R 文档 就在本周可能会详细说明aggregate tapply 和 by 之间的差异以及更好地互连 的小方法 但我看不出有什么办法可以真正回报这一贡献 我查看了开发人员网站 似乎我的
  • PHP SQL数据库查询错误信息

    这段SQL代码有什么问题吗 我从教程中得到它 但它返回以下错误消息 数据库查询失败 您有一个 SQL 语法错误 检查 与您的 MySQL 对应的手册 服务器版本的正确语法 在第 1 行 LIMIT 1 附近使用 function get s
  • 使用 python 将 tsv 文件转换为 xls/xlsx

    我想将 tsv 格式的文件转换为 xls xlsx 我尝试使用 os rename sample tsv sample xlsx 但转换后的文件已损坏 还有其他方法吗 这是一个使用 TSV 转换为 XLSX 的简单示例XlsxWriter
  • Android - 使用应用程序上下文创建 WebView 后如何将其附加到 Activity

    我正在使用应用程序上下文在后台创建一个 Android WebView 以便在我需要显示它时加载并准备好它 当需要时 我使用 addView 将其附加到我的 Activity 中 这通常工作得很好 但是当我尝试打开 HTML 选择下拉列表时