java - 如何在 Android 中的 WebView 中强制将 DatePicker 用于输入而不是键盘上的 HTML 文本输入

标签 java javascript android datepicker webview

我正在尝试学习 Android 开发并修改了一个在 WebView 中加载网页的示例应用程序。网页包含文本输入。我想使用 Android DatePicker 来输入一个值而不是键盘。

下面的代码几乎可以工作。当我选择一个日期并在 onDateSet 处理程序中的 WebView 上调用 loadUrl 以更新文本输入的值时,会显示 DatePicker 但抛出未知错误(代码示例结束)。我怀疑是跨线程问题,但我不确定。任何指导表示赞赏。

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
            }

        };
}

最佳答案

看起来 runOnUiThread 成功了。

关于java - 如何在 Android 中的 WebView 中强制将 DatePicker 用于输入而不是键盘上的 HTML 文本输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3384011/

相关文章:

java - Maven 是如何知道将源文件放在 exploded 目录下的什么位置?

javascript - 我无法从我网站上的 facebook 登录获取电子邮件范围

php - 将 href (html) 标签与 PHP 一起使用

javascript - 使用 JavaScript 从 SP 列表中隐藏/删除 ContentType

java - 异步和 ListView Android

java - 如何同时从 URL 列表中获取 InputStream?

java - IntelliJ Maven 项目导入

android - WiFi 直接 : How to Connect and interact with peers programmatically without user intervention?

java - 更改 Java 默认类(不覆盖)

android - 如何在 HERE MAP (android) 中执行 map 标记点击