2011-02-08 71 views
0

我有一个Android应用程序,运行加载某个页面的WebView,也是应用程序的一部分。我想使用Android DatePicker从用户获取日期,并在WebView中的页面内的输入上设置值。在onPageFinished事件之外的Webview中注入Javascript(使用DatePicker在WebView的输入上设置日期)

当用户点击输入时打开DatePickerDialog,但是当我得到日期选择的返回时,我无法运行loadUrl方法来设置输入值,它给了我一个错误和应用程序崩溃。

的代码(这是一个测试代码,所以不介意这是一个有点断章取义)一点点:

I类提供给的WebView:

public class webViewInterface { 
    public void openDatePicker(){ 
     showDialog(0); 
    } 
} 

在页面上JavaScript函数,呼吁输入点击:

function openDatePicker() { 
     if (objAndroid != null) objAndroid.openDatePicker(); 
    } 

监听的日期选择

private DatePickerDialog.OnDateSetListener mDateSetListener = 
    new DatePickerDialog.OnDateSetListener() { 

     public void onDateSet(DatePicker view, int year, 
           int monthOfYear, int dayOfMonth) { 

      mWebView.loadUrl("javascript:setReturnDate();"); 
     } 
    }; 

JavaScript函数设置输入

function setReturnDate() { 
     document.getElementById('txtAgency').value = '9999'; 
    } 

任何想法的值?

在此先感谢。

+0

使用`ADB logcat`,DDMS或DDM在Eclipse中查看LogCat并查看与错误相关的堆栈跟踪。 – CommonsWare 2011-02-08 13:19:58

回答

2

感谢@CommonsWare的评论,我跟踪误差,并得到这个:

“android.view.ViewRoot $ CalledFromWrongThreadException:只有创建视图层次可以触摸其观点原来的线程。”

Google搜索,并得到this forum thread

因此,为了更新在运行时的界面视图和外面的线程,你必须使用一个处理程序,接收邮件,并相应地执行动作。

所以我实现的处理程序的活动,即得到一个消息与一个int标识符和我想更新到网页视图中的数据:

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方法类使用处理程序,以及创建一个输入参数,该参数是在页面控制的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); 
    } 

读和写OTE的DatePicker的侦听器日期选择,以获得数据并发送消息到处理程序:

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)"); 
      } 
相关问题