Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java DialogFragment时间选择器onCancel和onDismiss问题_Java_Android_Datepicker_Timepicker - Fatal编程技术网

Java DialogFragment时间选择器onCancel和onDismiss问题

Java DialogFragment时间选择器onCancel和onDismiss问题,java,android,datepicker,timepicker,Java,Android,Datepicker,Timepicker,我曾尝试实现一个时间选择器,它由SwitchCompat打开,因此当我启用该选项时,时间选择器会显示出来,工作正常,但如果我按下“取消”,或“后退”按钮,或只是在时间选择器外部按下,开关将保持在打开位置,我希望它在我不选择时间选择器时返回到关闭位置。虽然onCancel方法可能有帮助,但它没有,或者只是我在实现它时犯了一些错误,下面是相关代码: 公共类设置扩展AppCompatActivity实现TimePickerDialog.OnTimeSetListener、TimePickerDialo

我曾尝试实现一个时间选择器,它由SwitchCompat打开,因此当我启用该选项时,时间选择器会显示出来,工作正常,但如果我按下“取消”,或“后退”按钮,或只是在时间选择器外部按下,开关将保持在打开位置,我希望它在我不选择时间选择器时返回到关闭位置。虽然onCancel方法可能有帮助,但它没有,或者只是我在实现它时犯了一些错误,下面是相关代码:

公共类设置扩展AppCompatActivity实现TimePickerDialog.OnTimeSetListener、TimePickerDialog.OnDismissListener、TimePickerDialog.OnCancelListener{
私人编辑文本最后一小时;
私钥监听器;
专用开关兼容小时开关;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u设置);
textLastHour=findViewById(R.id.finalHourText);
textLastHour.setKeyListener(空);
textLastHour.setHint(“未选择选项”);
hourSwitch=findviewbyd(R.id.switch\u小时);
hourSwitch.setOnCheckedChangeListener(新建CompoundButton.OnCheckedChangeListener(){
检查更改后的公共无效(复合按钮视图,布尔值已检查){
如果(已检查){
DialogFragment timePicker=新的TimePickerFragment();
show(getSupportFragmentManager(),“时间选择器”);
}否则{
textlasthhour.setText(“”);
}
}
});
}
@凌驾
时间集上的公共void(时间选择器视图,整数小时日,整数分钟){
textLastHour=findViewById(R.id.finalHourText);
textLastHour.setText(“最后警报时间:“+hourOfDay+”:“+minute”);
}
@凌驾
public void onCancel(对话框接口对话框){
hourSwitch.setChecked(假);
}
@凌驾
公共void onDismiss(对话框接口对话框){
hourSwitch.setChecked(假);
}
}
我已经试过了
onDismiss
onCancel
,但都没有在这里工作过,如果你取消时间选择器,有没有办法让开关回到原来的位置?在标签中添加了
DatePicker
,因为我觉得对于这个问题,它可能与
TimePicker
具有相同的解决方案

我的
TimePickerFragment
类:

公共类TimePickerFragment扩展了DialogFragment{
@非空
@凌驾
创建对话框上的公共对话框(Bundle savedInstanceState){
Calendar c=Calendar.getInstance();
int hour=c.get(日历小时);
int minute=c.get(Calendar.minute);
返回新的TimePickerDialog(getActivity(),(TimePickerDialog.OnTimeSetListener)getActivity(),小时,分钟,日期格式.is24HourFormat(getActivity());
}
}

实际上比我想象的要简单,您只需添加一个侦听器并相应地更改ui/逻辑即可

TimePickerDialog dialog=new TimePickerDialog(这是new TimePickerDialog.onttimesetlistener(){
@凌驾
时间集上的公共void(时间选择器视图,整数小时日,整数分钟){
}
},10,10,正确);
setOnCancelListener(新的DialogInterface.OnCancelListener(){
@凌驾
public void onCancel(对话框接口对话框){
Toast.makeText(MainActivity.this,“disposed”,Toast.LENGTH_LONG.show();
}
});
dialog.show();
您可以使用标准的TimePickerDialog


编辑:将所有内容放到
onCreate()
中,除了
dialog.show()
dialog.show()
进入开关中的ifChecked中,正如我在代码中看到的,您在TimePickerFragment类中没有定义任何侦听器。您可以在TimePickerFragment中添加以下代码:

public  class TimePickerFragment(Context context) extends DialogFragment{

    interface OnCompleteListener {
        abstract void onComplete(boolean suceeded);
    }

    OnCompleteListener listener;

    /**

    * your other lines of code

    **/
}
别忘了为类设置上下文参数

然后重写onAttach函数,并在其内部实现侦听器,如下所示:

try {
            this.listener = (OnCompleteListener) context;

        } catch (ClassCastException e) {

            throw ClassCastException(activity.toString() + " must implement OnCompleteListener");

        }
在此之后,在override onDismiss()中设置
listener.onComplete(false)在里面。每当TimePickerFragment想要成功完成时,只需设置
listener.onComplete(true)


现在我们回到主要活动。首先,让MainActivity实现
TimePickerFragment.OnCompleteListener

现在需要重写CompleteListener的
抽象函数。简单地说,如果参数为false,则意味着对话框取消成功,因此使用简单的if条件,以编程方式将
开关设置为off。



希望我能帮上忙。

从我看到的情况来看,当用户未设置时间时,您在取消/取消时没有回调。我建议创建另一个类,该类将继承TimePickerDialog,并在对话框关闭时创建另一个回调。我将在这里添加我的TimePickerClass,是的,我对这些方法有问题,但不知道如何修复它们,在internet上找到了onCancel和onDismiss侦听器,但是没有一个解决方案适用于methe(上下文)在中创建错误class@PatrykLipka我已经从Kotlin迁移到java,因此可能需要做一些更改,但是当您添加此参数时,您应该在MainActivity
TimePickerFragment对话框=new TimePickerFragment(此)中实例化TimePickerFragment时传递活动我应该在哪里添加代码?我有点不明白。是否应该在if(ifChecked)中?正确,如果您只想在用户打开开关/复选框时打开对话框,代码需要在那里。非常感谢,这对我帮助很大,只需将onDismissListener更改为onCancelListener,因为即使在我尝试设置时间之后,onDismissListener也会启动