WebView引入页面及回调处理
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/white" android:orientation="vertical" > <!-- 头部和尾部为重用和统一风格 --> <!-- 头部 --> <include layout="@layout/jx_two_page_header"/> <WebView android:id="@+id/wvTicketOne" android:layout_width="fill_parent" android:layout_height="fill_parent" /> <!-- 尾部 --> <include android:id="@+id/footer" layout="@layout/jx_two_footer"/> </LinearLayout>
在Activity的onCreate方法中加载页面
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.ticket_one);
/**
* 在android 2.3以后进行了较为严格的限制
* 该类可以用来帮助开发者改进他们编写的应用。
* 并且提供了各种的策略,
* 这些策略能随时检查和报告开发者开发应用中存在的问题
*/
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads().detectDiskWrites().detectNetwork()
.penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects().penaltyLog().penaltyDeath()
.build());
Intent fromInent = getIntent();
ticketId = fromInent.getStringExtra("ticketId");
//是否管理员
String isManage = mPreferences.getString(Constants.USER_IS_MANAGE, String.valueOf(false));
//找到WebView控件
wvTicketOne = (WebView) findViewById(R.id.wvTicketOne);
//设置为可访问页面JS,在Activity和页面直接互调时使用
wvTicketOne.getSettings().setJavaScriptEnabled(true);
wvTicketOne.setWebViewClient(new WebViewClient());
//在onCreate 方法中调用WebView的loadUrl方法加载页面内容
wvTicketOne.loadUrl(Constants.URL_TICKET_ONE + ticketId+"&isManage="+isManage);
//添加页面可访问的JS接口
wvTicketOne.addJavascriptInterface(new JavaScriptInterface(), "android");
// Activity间跳转:转到踏勘单
TextView takandan = (TextView) findViewById(R.id.tanKanDan);
takandan.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(TicketOneActivity.this,TicketTanKanDan.class);
intent.putExtra("ticketId", ticketId);
startActivity(intent);
}
});
//返回按钮:这里做了最简单的处理,直接把当前Activity给关掉,
//程序自动返回到上一个Activity(前提是上一个Activity没有销毁)
ImageButton btnBack = (ImageButton) findViewById(R.id.cursor_back);
btnBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
//隐藏(后退、1/1、前进、刷新)按钮
ImageButton cursor_left = (ImageButton) findViewById(R.id.cursor_left);
cursor_left.setVisibility(View.INVISIBLE);
ImageButton cursor_right = (ImageButton) findViewById(R.id.cursor_right);
cursor_right.setVisibility(View.INVISIBLE);
ImageButton cursor_refresh = (ImageButton) findViewById(R.id.cursor_refresh);
cursor_refresh.setVisibility(View.INVISIBLE);
TextView tv_infoTotal=(TextView)findViewById(R.id.infoTotal);
tv_infoTotal.setVisibility(View.INVISIBLE);
TextView tv_infoView=(TextView)findViewById(R.id.infoView);
tv_infoView.setVisibility(View.INVISIBLE);
TextView tv_infoNum=(TextView)findViewById(R.id.infoNum);
tv_infoNum.setVisibility(View.INVISIBLE);
}
在Activity中创建一个页面可访问的JavaScript接口,供页面调用
private class JavaScriptInterface {
private MediaPlayer mediaPlayer;
public JavaScriptInterface(){
mediaPlayer = new MediaPlayer();
}
/**
* 播放
* @param url 播放文件路径
*/
public void playMusic(String url){
if(mediaPlayer.isPlaying()){
mediaPlayer.reset();
}
try{
mediaPlayer.setDataSource(url);
mediaPlayer.prepare();
mediaPlayer.start();
}catch (Exception e) {
e.printStackTrace();
}
}
/**
* 暂停
*/
public void stopMusic(){
if(mediaPlayer.isPlaying()){
mediaPlayer.stop();
}
}
/**
* GPS显示
* @param gps
*/
public void showGps(String gps){
Intent i = new Intent(TicketOneActivity.this, MapActivity.class);
i.putExtra("gps", gps);
startActivity(i);
}
/**
* 提示信息
* @param msg
*/
public void showMsg(String msg){
if(CommonUtils.validateStr(msg)){
Toast.makeText(TicketOneActivity.this, msg, Toast.LENGTH_SHORT).show();
}
if(CommonUtils.matchString(msg, "提交成功")){
finish();
}
}
}
上面的showMsg方法在页面被调用
//页面调用Activity中的JavaScriptInterface方法 function Msg(msg){ if (window.android){ window.android.showMsg(msg); }else{ alert(msg); } }
----------------------------------------------
在Activity中,也可以将处理的结果返回给页面。以下是一个在任务监听中将结果返回给页面JS的例子。
/**
* 签名任务监听
*
* @author lihua
*/
private TaskListener signTicketTaskListener = new TaskAdapter() {
@Override
public void onPostExecute(GenericTask task, String result) {
//处理完成删除本地文件
FileHelper.delFiles(REC_DIR);
JSONObject signInfo = (JSONObject) getApi().getBackResult(result,
getApplicationContext());
String data = "";
String signdate = "";
try {
data = signInfo.getString("result");
signdate = signInfo.getString("signdate");
} catch (JSONException e) {
e.printStackTrace();
}
String [] signArray = CommonUtils.splitByTag(data, "$");
String words = "",sign ="",gps="",voice="",gid = "",gdt="";
//add edit
if(signArray!=null&&signArray.length>0)
for (String s : signArray) {
if(s!=null&&s.startsWith(Constants.START_TAG_WORD))
words = s.replace(Constants.START_TAG_WORD, "");
if(s!=null&&s.startsWith(Constants.START_TAG_SIGN))
sign = s.replace(Constants.START_TAG_SIGN, "");
if(s!=null&&s.startsWith(Constants.START_TAG_GPS))
gps = s.replace(Constants.START_TAG_GPS, "");
}
String cbstr ="";
//页面显示设置,调用页面名称为cbTicketSign的js函数
cbstr= "javascript:cbTicketSign('"+
words+"','"+
Constants.SERVER_FILE_CONTENT_TICKET + sign+"','"+
gps+"','"+
signdate+"'"+
")";
System.out.println("cbstr:"+cbstr);
wvTicketOne.loadUrl(cbstr);
//关闭提示对话框
mDialog.dismiss();
}
@Override
public String getName() {
return "Login";
}
};
页面JS针对Activity的回调函数和JS的普通函数没有多大区别,以下是上面Activity中调用的JS函数。
//工作票签名回调 function cbTicketSign(sAttr, words, sign, gps ,voice , date){ if(sAttr=="workGroupSign"){ $('#workGroupSignLbl').html(words); $('#workGroupSignLbl').hide(); $('#workGroupSignImg').show(); $("#workGroupSignImg").attr("src","${root }"+sign); $("#workGroupSignGps").attr("src","${root}/images/ticket/gps.png"); $("#workGroupSignGps").bind("click",function(){ showGps(gps); }); } }