无法在调用DatePickerDialog Show时添加窗口异常

问题描述 投票:0回答:1

我是Android Studio和Android开发的新手,但是通过一些在线查询,我写了一个类来处理DatePickerDialog和TimePickerDialog请求以设置日期。

基于一个示例,我编写了该类:

class DatePick extends cweb.companion.ActivityBased
{
    protected android.app.Activity activity;
    public final java.util.Calendar currentDate = java.util.Calendar.getInstance();
    private boolean picked;
    public java.util.Calendar date;

    public java.util.Calendar pickDate()
    {
        this.picked = false;
        this.date = java.util.Calendar.getInstance();
        android.app.DatePickerDialog datePicker = new android.app.DatePickerDialog(this.activity.getApplicationContext(), new android.app.DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(android.widget.DatePicker view, int year, int month, int dayOfMonth) { cweb.companion.DatePick.this.date.set(view.getYear(), view.getMonth(), view.getDayOfMonth()); } }, this.currentDate.get(java.util.Calendar.YEAR), this.currentDate.get(java.util.Calendar.MONTH), this.currentDate.get(java.util.Calendar.DAY_OF_MONTH)) { @Override public void onClick(android.content.DialogInterface dialog, int which) { cweb.companion.DatePick.this.picked = (which == android.content.DialogInterface.BUTTON_POSITIVE); } };
        datePicker.show(); //todo resolve: exception here for unable to add window null token
        datePicker = null; //dispose?
        if (this.picked)
        {
            android.app.TimePickerDialog timePicker = new android.app.TimePickerDialog(this.activity.getApplicationContext(), new android.app.TimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(android.widget.TimePicker view, int hourOfDay, int minute) { cweb.companion.DatePick.this.date.set(cweb.companion.DatePick.this.date.get(java.util.Calendar.YEAR), cweb.companion.DatePick.this.date.get(java.util.Calendar.MONTH), cweb.companion.DatePick.this.date.get(java.util.Calendar.DAY_OF_MONTH), hourOfDay, minute); } }, this.currentDate.get(java.util.Calendar.HOUR_OF_DAY), this.currentDate.get(java.util.Calendar.MINUTE), true) { @Override public void onClick(android.content.DialogInterface dialog, int which) { cweb.companion.DatePick.this.picked = (which == android.content.DialogInterface.BUTTON_POSITIVE); } };
            timePicker.show(); //picked may change back to false after that (maybe, depending on the user's confirm/abort)
            timePicker = null; //dispose?
        }
        if (!this.picked) { this.date = null; }
        return cweb.companion.DatePick.this.date;
    }

    public static java.lang.String toString(java.util.Calendar date) { return java.lang.String.format("%02d", date.get(java.util.Calendar.DAY_OF_MONTH)) + "/" + java.lang.String.format("%02d", date.get(java.util.Calendar.MONTH)) + "/" + java.lang.String.format("%04d", date.get(java.util.Calendar.YEAR)) + " " + java.lang.String.format("%02d", date.get(java.util.Calendar.HOUR_OF_DAY)) + ":" + java.lang.String.format("%02d", date.get(java.util.Calendar.MINUTE)) + ":" + java.lang.String.format("%02d", date.get(java.util.Calendar.SECOND)); }
    public DatePick(android.app.Activity activity) { this.activity = activity; }
}

然后通过此声明在我的MainActivity(应用程序中唯一的活动)中调用它:

public class MainActivity extends androidx.appcompat.app.AppCompatActivity
{
    protected android.widget.Button datePickCall;
    private java.util.Calendar date;

    private void pickdatePickCall()
    {
        cweb.companion.DatePick picker = new cweb.companion.DatePick(this);
        this.date = picker.pickDate();
        this.datePickCall.setText(cweb.companion.DatePick.toString(this.date));
    }

    @Override protected void onCreate(android.os.Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        this.setContentView(cweb.companion.R.layout.activity_main);
        this.datePickCall = this.findViewById(cweb.companion.R.id.datePickCall);
        this.datePickCall.setOnClickListener(new android.view.View.OnClickListener() { @Override public void onClick(android.view.View v) { cweb.companion.MainActivity.this.pickdatePickCall(); }});
    }
}

但是当我调试该应用程序时,在DatePick类的todo标记的行上,它调用对话框的“ show()”方法,我得到了一个异常和消息,关于“无法添加窗口-令牌为空,活动在运行吗?“。似乎无法理解它是如何工作的,没有任何帮助吗?

java android android-studio android-alertdialog
1个回答
0
投票

尝试用活动上下文替换应用程序上下文。

DatePickerDialog(Context context)为以下对象创建一个新的日期选择器对话框使用父上下文的默认日期选择器对话框的当前日期主题

来源:https://developer.android.com/reference/android/app/DatePickerDialog

© www.soinside.com 2019 - 2024. All rights reserved.