感谢@CommonsWare 的评论,我跟踪了错误并得到了这个:
“android.view.ViewRoot$CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能触摸其视图。”
谷歌搜索并得到这个论坛主题 https://stackoverflow.com/questions/1157814/how-to-access-original-activitys-views-from-spawned-background-service
因此,为了在运行时和线程外部更新 UI 中的视图,您必须使用处理程序来接收消息并相应地执行操作。
所以我为 Activity 实现了一个处理程序,它获取一条带有 int 标识符的消息和我想要更新到 web 视图中的数据:
final Handler handler = new Handler() {
public void handleMessage(Message msg) {
int cod = msg.getData().getInt("messageType");
switch(cod){
case 1:
String date = msg.getData().getString("datePickerValue");
mWebView.loadUrl("javascript:setReturnDate('" + mId + "', '" + date + "');");
break;
case 2:
showDialog(0);
break;
}
}
};
我必须更改该类的 openDatePicker 方法以使用 Handler,并创建一个输入参数,它是页面中控件的 id:
public void openDatePicker(String id){
mId = id; //mId is a string declared in the Activity scope, so it can be used anywhere
Message msg = new Message();
Bundle b = new Bundle();
b.putInt("messageType", 2);
msg.setData(b);
handler.sendMessage(msg);
}
重写了日期选择的 DatePicker 监听器,以获取数据并向 Handler 发送消息:
private DatePickerDialog.OnDateSetListener mDateSetListener =
new DatePickerDialog.OnDateSetListener() {
public void onDateSet(DatePicker view, int year,
int monthOfYear, int dayOfMonth) {
Message msg = new Message();
Bundle b = new Bundle();
b.putInt("messageType", 1);
b.putString("datePickerValue",
String.format("%02d", dayOfMonth) + "/" +
String.format("%02d", (monthOfYear + 1)) + "/" +
String.valueOf(year));
msg.setData(b);
handler.sendMessage(msg);
}
};
在网页中,js函数是这样的:
function openDatePicker(id) {
if (objAndroid != null) objAndroid.openDatePicker(id);
}
function setReturnDate(id, date) {
var obj = document.getElementById(id);
if (obj != null)
obj.value = date;
}
最后,输入(文本框)如下所示:
TextBox obj = FindControl("txtDt") as TextBox;
if (obj != null)
{
obj.Attributes.Add("readonly", "readonly");
obj.Attributes.Add("OnClick", "javascript:openDatePicker(this.id)");
}