请问一个关于ViewPager中Webview调用JS方法的问题。

lettime 2014-10-27 04:14:43
我在ViewPager中装载Webview来显示HTML,同时显示的HTML中有图片,因此我注入了一个JS函数来跳转到另一个Activity中进行显示并能进行缩放操作。完整代码如下

public class SingalSubjectFragment extends Fragment {

private Context mContext;
private WebView mWebView;
private Subject mSubject = new Subject();

public SingalSubjectFragment(Context tContext,Subject subject){
this.mContext = tContext;
this.mSubject = subject;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

LinearLayout grouplayout = new LinearLayout(
getActivity().getApplicationContext());
final ProgressBar progressBar = new ProgressBar(mContext,null,android.R.attr.progressBarStyleHorizontal);
grouplayout.setOrientation(0);
grouplayout.addView(progressBar);
mWebView = new WebView(mContext);
mWebView.loadUrl(mSubject.getUrl());
grouplayout.addView(mWebView);

WebSettings settings = mWebView.getSettings();
settings.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
settings.setDomStorageEnabled(true);

mWebView.addJavascriptInterface(new JavascriptInterface(getActivity()), "imagelistner");
mWebView.setWebViewClient(new MyWebViewClient());
mWebView.setWebChromeClient(new WebChromeClient(){
@Override
public void onProgressChanged(WebView view, int newProgress) {
// TODO Auto-generated method stub
super.onProgressChanged(view, newProgress);
if (newProgress == 0) {
progressBar.setVisibility(View.VISIBLE);
}
progressBar.setProgress(newProgress);
progressBar.postInvalidate();
if (newProgress == 100) {
//textView.setVisibility(View.GONE);
progressBar.setVisibility(View.GONE);
}
}
});
return grouplayout;
}

// 注入js函数监听
private void addImageClickListner() {
// 这段js函数的功能就是,遍历所有的img几点,并添加onclick函数,在还是执行的时候调用本地接口传递url过去
mWebView.loadUrl("javascript:(function(){" +
"var objs = document.getElementsByTagName(\"img\"); " +
"for(var i=0;i<objs.length;i++) " +
"{"
+ " objs[i].onclick=function() " +
" { "
+ " window.imagelistner.openImage(this.src); " +
" } " +
"}" +
"})()");
}

// js通信接口
public class JavascriptInterface {

private Context context;

public JavascriptInterface(Context context) {
this.context = context;
}

public void openImage(String img) {
String fName = img.trim();
String fileName = fName.substring(fName.lastIndexOf("/")+1);
Intent intent = new Intent();
intent.putExtra("image", img);
intent.putExtra("fileName", fileName);
intent.setClass(context, ShowWebImageActivity.class);
context.startActivity(intent);
//System.out.println(img);
}
}

// 监听
private class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {

return super.shouldOverrideUrlLoading(view, url);
}

@Override
public void onPageFinished(WebView view, String url) {

view.getSettings().setJavaScriptEnabled(true);

super.onPageFinished(view, url);
// html加载完成之后,添加监听图片的点击js函数
addImageClickListner();

}

@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
view.getSettings().setJavaScriptEnabled(true);

super.onPageStarted(view, url, favicon);
}

@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {

super.onReceivedError(view, errorCode, description, failingUrl);

}
}

public void WebLoadUrl(String url){
mWebView.loadUrl(url);
}

}

当我加载第一个组网页中的第一个时,点击图片能够跳转到显示图片的Activity。但当我推出再通过ViewPager中的Webview加载另一组网页时,点击图片却无法跳转了,并有如下错误信息:
Uncaught TypeError: Cannot call method 'openImage' of undefined at null:1
同时我再次加载第一组网页时点击图片时也无法跳转了。
请问这个是什么问题,能怎么解决。
...全文
499 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
lettime 2014-11-05
  • 打赏
  • 举报
回复
引用 2 楼 sinat_22682411 的回复:
我也遇到过类似的问题,js失效了。说白了就是注入js对象的webview对象不是一个,你可以通过初始化,onpageStart打印出webview对象看看。要保持初始化及加载页面所用的webview对象一致
这位兄弟,可以详细说下吗
sinat_22682411 2014-10-29
  • 打赏
  • 举报
回复
我也遇到过类似的问题,js失效了。说白了就是注入js对象的webview对象不是一个,你可以通过初始化,onpageStart打印出webview对象看看。要保持初始化及加载页面所用的webview对象一致
lettime 2014-10-27
  • 打赏
  • 举报
回复
再顶顶。。。

80,470

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧