2010-08-01 4 views
1

Android 개발을 배우려고 시도 중이며 WebView에서 웹 페이지를로드하는 샘플 앱을 수정했습니다. 웹 페이지는 텍스트 입력을 포함합니다. Android DatePicker를 사용하여 키보드 대신 값을 입력하고 싶습니다.Android에서 WebView 내부의 HTML 텍스트 입력에서 키보드 대신 DatePicker를 입력하도록하는 방법은 무엇입니까?

아래 코드는 거의 작동합니다. datePicker가 표시되지만 날짜를 선택하고 onDateSet 핸들러의 WebView에서 loadUrl을 호출하면 텍스트 입력 값 (코드 샘플의 끝)을 업데이트 할 때 알 수없는 오류가 발생합니다. 나는 크로스 스레드 문제를 의심하지만 잘 모르겠습니다. 모든 지침을 부탁드립니다. runOnUiThread 트릭을했던 것처럼

package com.freeze.android.hellowebview; 

import java.util.Calendar;  
import android.app.Activity; 
import android.app.DatePickerDialog; 
import android.app.Dialog; 
import android.os.Bundle; 
import android.view.KeyEvent; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 
import android.widget.DatePicker; 

public class HelloWebView extends Activity { 

    WebView webview; 

    class DateJavaScriptInterface 
    { 
     public void pickDate() { 
      showDialog(0);   
     } 
    } 
    public void loadScript(String script){  
     webview.loadUrl("javascript:(function() { " + script + "})()");    
    } 

    private class HelloWebViewClient extends WebViewClient { 
     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      view.loadUrl(url); 
      return true; 
     } 

     @Override 
     public void onPageFinished(WebView view, String url) {   
      loadScript("document.getElementById('trips_dateandtime').onfocus = function(){this.blur();window.DateInterface.pickDate();};");  
     } 
    } 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     webview = (WebView) findViewById(R.id.webview); 
     webview.setWebViewClient(new HelloWebViewClient()); 
     webview.getSettings().setJavaScriptEnabled(true); 
     webview.addJavascriptInterface(new DateJavaScriptInterface(), "DateInterface"); 
     webview.loadUrl("http://127.0.0.1:8000/mileage/default/index"); 
    } 

    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) {  
     if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) { 
      webview.goBack(); 
      return true; 
     } 
     return super.onKeyDown(keyCode, event); 
    } 

    @Override 
    protected Dialog onCreateDialog(int id) { 
     switch (id) { 
     case 0: 
      final Calendar c = Calendar.getInstance(); 
      int mYear = c.get(Calendar.YEAR); 
      int mMonth = c.get(Calendar.MONTH); 
      int mDay = c.get(Calendar.DAY_OF_MONTH); 
      return new DatePickerDialog(this, 
         mDateSetListener, 
         mYear, mMonth, mDay); 
     } 
     return null; 
    } 

    private DatePickerDialog.OnDateSetListener mDateSetListener = 
     new DatePickerDialog.OnDateSetListener() { 
      @Override 
      public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { 
       loadScript("document.getElementById('trips_dateandtime').value = 'test';"); //ERROR 
      } 

     }; 
} 
+0

덕분에 많은 도움이되었습니다. – CiscoIPPhone

답변

2

보인다.

관련 문제