如何在导入的Rich Text Editor库模块中调用主应用的类方法?
解决方案
核心思路是通过接口回调解耦库模块和主应用,避免库直接依赖主应用代码产生循环依赖问题,实现步骤如下:
步骤1:在Rich Text Editor库中定义回调接口
首先在库模块中新增公共回调接口,用于跨模块传递事件:
// 放在库模块的WebAppInterface同级别目录下 interface OnWebActionCallback { fun onVideoTimestampClick(timestamp: Float) }
步骤2:修改库中的WebAppInterface类
调整构造函数传入回调实例,收到JS触发的事件时直接调用回调方法即可:
class WebAppInterface( var mContext: Context, // 新增回调参数 private val callback: OnWebActionCallback ) { // 注意:方法名要和JS调用的保持一致,你原来JS里调用的是showToast,这里要把方法名从getString改成showToast,否则触发不了 @JavascriptInterface fun showToast(text: String) { // 把拿到的文本转成Float时间戳,调用回调 val timestamp = text.toFloatOrNull() ?: return callback.onVideoTimestampClick(timestamp) } }
注意:这里要和你的JS代码匹配,JS中调用的是
window.Android.showToast(text),所以Java/Kotlin层的@JavascriptInterface注解的方法名必须是showToast,之前的getString方法名不匹配,会导致调用失败。
步骤3:主应用VideoViewingFragment实现回调接口
主应用的Fragment实现库中定义的回调接口,在回调方法中调用自身的startsomething逻辑:
// 让Fragment实现库中的OnWebActionCallback接口 class VideoViewingFragment : Fragment, OnWebActionCallback { // ...你的原有代码... fun startsomething(vidTimestamp: Float){ youTubePlayerView.getYouTubePlayerWhenReady(object: YouTubePlayerCallback{ override fun onYouTubePlayer(youTubePlayer: YouTubePlayer) { youTubePlayer.seekTo(vidTimestamp) } }) } // 实现回调接口的方法 override fun onVideoTimestampClick(timestamp: Float) { // 直接调用你现有的逻辑即可 startsomething(timestamp) } // 在你初始化WebView、创建WebAppInterface的位置,传入当前Fragment实例作为回调 private fun initWebView() { // ...你的WebView初始化逻辑... // 原来的写法是 webView.addJavascriptInterface(WebAppInterface(requireContext()), "Android") // 现在改成传入callback webView.addJavascriptInterface(WebAppInterface(requireContext(), this), "Android") } }
内容的提问来源于stack exchange,提问作者Syazlina Aasim
相关产品推荐
相关产品推荐

