【问题标题】:Display android DatePicker on click of a button in Javascript单击Javascript中的按钮显示android DatePicker
【发布时间】:2012-04-26 06:13:04
【问题描述】:

这是我的要求: 我正在将一个 html 文件加载到 WebView 上。我在 html 文件中有一个按钮来选择日期。当我单击该按钮时,我想打开 android 日期选择器对话框。选择日期后,我想在 html 文件中显示所选日期。谁能指导我。请。 HTML:

 <input type="button" value="Select Date" onClick="openDatePickerDialog()" />
 <p id = "date">--</p>

Javascript:

 function openDatePickerDialog() {
   AndroidFunction.openDatePickerDialog();
 }

function callFromActivity(date) {
document.getElementById('date').innerHTML = date;
 }

我的活动:

  public class MainActivity extends Activity {
WebView myBrowser;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    myBrowser = (WebView)findViewById(R.id.mybrowser);

    final MyJavaScriptInterface myJavaScriptInterface = new MyJavaScriptInterface(this);
    myBrowser.addJavascriptInterface(myJavaScriptInterface, "AndroidFunction");

    myBrowser.getSettings().setJavaScriptEnabled(true); 

    myBrowser.loadUrl("file:///android_asset/test.html");      



}

public class MyJavaScriptInterface 
{
    private int mYear;
    private int mMonth;
    private int mDay;
    static final int DATE_DIALOG_ID = 0;

    Context mContext;

    MyJavaScriptInterface(Context c)
    {
        mContext = c;
    }


    public void openDatePickerDialog()
    { 
        Calendar c = Calendar.getInstance();
        mYear = c.get(Calendar.YEAR);
        mMonth = c.get(Calendar.MONTH);
        mDay = c.get(Calendar.DAY_OF_MONTH);

        //updateDisplay();

        showDialog(DATE_DIALOG_ID);
    }
    private void updateDisplay() {

        String date = new StringBuilder().append(mMonth + 1).append("-")
        .append(mDay).append("-")
        .append(mYear).append(" ").toString();

        Toast.makeText(getApplicationContext(), date, Toast.LENGTH_LONG).show();

        myBrowser.loadUrl("javascript:callFromActivity(\""+date+"\")");
    }


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

        public void onDateSet(DatePicker view, int year, 
                int monthOfYear, int dayOfMonth) {
            mYear = year;
            mMonth = monthOfYear;
            mDay = dayOfMonth;
            updateDisplay();
        }
    };


    protected Dialog onCreateDialog(int id) {
        switch (id) {
        case DATE_DIALOG_ID:
            return new DatePickerDialog(MainActivity.this,
                    mDateSetListener,
                    mYear, mMonth, mDay);
        }
        return null;
    }

}
 }

问题:当我点击按钮时,我没有得到 DatePicker 对话框。我哪里错了?我的方法正确吗?

【问题讨论】:

  • 您在哪里设置 onclicklistner 以接收按钮点击事件。只有这样你才能调用函数 openDatePickerDialog
  • Bharat,如果我取消注释 openDatePickerDialog() 中的 updateDisplay() 行,toast 消息正在显示。这意味着 openDatePickedDialog() 方法被调用。
  • DatePickerDialog(MainActivity.this,mDateSetListener,mYear, mMonth,mDay);而不是 MainActivity.this 您可以尝试使用已通过的 mContext
  • getapplicationcontext 你也试过了
  • 我也试过getAppContext(),还是不行

标签: javascript android html datepicker


【解决方案1】:

这是我使用的示例代码,来自此处的代码:

在html代码中,添加2个javascript函数:

// Fonction d'appel calendrier Android
function f_CallCalendar(Tag)
{
    MSSAndroidFunction.openDatePickerDialog(Tag);
}
// Fonction de retour de la date
function callFromActivity_RetDate(Tag, data) {
    document.Form.vDate.value = data;
}

Tag 是要完成的输入表单的 id。您可以这样调用 javascript 函数:

<input name="vDate" type="text" size="11" />&nbsp;
<input name="Submit" type="button" onclick="f_CallCalendar('vDate')" value="Calendrier*" />

这是实现的java代码。请注意,MyJavaScriptInterface 是在 MainActivity 中声明的:

public class MainActivity extends Activity 
        implements TextWatcher{
    WebView MainWebView;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        MainWebView = (WebView)findViewById(R.id.main_webview);
        MainWebView.getSettings().setJavaScriptEnabled(true);
        final MyJavaScriptInterface myJavaScriptInterface = new MyJavaScriptInterface(this);
        MainWebView.addJavascriptInterface(myJavaScriptInterface, "MyJavaScriptInterface");
    }

    // Classe de prise en charge du java privé
    public class MyJavaScriptInterface
    {
        public String m_szTagId;

        Context mContext;

        MyJavaScriptInterface(Context c)
        {
            mContext = c;
        }

        public void openDatePickerDialog(String szTagId)
        {
            m_szTagId = szTagId;
            Calendar c = Calendar.getInstance();
            DatePickerDialog dp = new DatePickerDialog(mContext, new OnDateSetListener() {
                public void onDateSet(DatePicker view, int year,
                        int monthOfYear, int dayOfMonth) {
                    String szDate = String.format("%02d/%02d/%04d", dayOfMonth, monthOfYear+1, year);
                    MainWebView.loadUrl("javascript:callFromActivity_RetDate(\""+m_szTagId+"\", \""+szDate+"\")");
                } }, c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH));
            dp.show();
        }

    } // Class MyJavaScriptInterface

} // class MainActivity

就是这样。希望这能有所帮助。

【讨论】:

    【解决方案2】:
    public void openDatePickerDialog()
    { 
        Calendar c = Calendar.getInstance();
        mYear = c.get(Calendar.YEAR);
        mMonth = c.get(Calendar.MONTH);
        mDay = c.get(Calendar.DAY_OF_MONTH);
    
        //updateDisplay();
        DatePickerDialog dp = new DatePickerDialog(this,
                mDateSetListener,
                mYear, mMonth, mDay);
        dp.show();
    }
    

    你能试试这个吗?

    【讨论】:

    • Bharat,我的按钮在 html 文件中。不在 android 布局 (xml) 文件中。
    • 是的,我正在寻找您的问题。
    • 但它会打开一个正常的警报对话框。以下代码在 openDatePickerDialog() 方法中工作。 AlertDialog.Builder myDialog = new AlertDialog.Builder(MainActivity.this); myDialog.setTitle("你好!"); myDialog.setMessage("示例测试"); myDialog.setPositiveButton("ON", null); myDialog.show();
    • 我明白了。我从 MyJavaScriptInterface 类中删除了与 DatePicker 相关的代码并放在 MainActivity 中。现在它起作用了。谢谢巴拉特
    • 现在我知道它不会调用 onCreateDialog 因为你是在一个简单的调用中实现的,而不是在活动中的活动中实际上你覆盖了它但是在你的类中没有父类所以你不能在允许时覆盖它将只是一个普通函数,而不是你可以尝试 mContext.oncreateDialog 在你的类中覆盖它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 2015-07-28
    • 1970-01-01
    相关资源
    最近更新 更多