Java DialogFragment时间选择器onCancel和onDismiss问题
我曾尝试实现一个时间选择器,它由SwitchCompat打开,因此当我启用该选项时,时间选择器会显示出来,工作正常,但如果我按下“取消”,或“后退”按钮,或只是在时间选择器外部按下,开关将保持在打开位置,我希望它在我不选择时间选择器时返回到关闭位置。虽然onCancel方法可能有帮助,但它没有,或者只是我在实现它时犯了一些错误,下面是相关代码:Java DialogFragment时间选择器onCancel和onDismiss问题,java,android,datepicker,timepicker,Java,Android,Datepicker,Timepicker,我曾尝试实现一个时间选择器,它由SwitchCompat打开,因此当我启用该选项时,时间选择器会显示出来,工作正常,但如果我按下“取消”,或“后退”按钮,或只是在时间选择器外部按下,开关将保持在打开位置,我希望它在我不选择时间选择器时返回到关闭位置。虽然onCancel方法可能有帮助,但它没有,或者只是我在实现它时犯了一些错误,下面是相关代码: 公共类设置扩展AppCompatActivity实现TimePickerDialog.OnTimeSetListener、TimePickerDialo
公共类设置扩展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,因此可能需要做一些更改,但是当您添加此参数时,您应该在MainActivityTimePickerFragment对话框=new TimePickerFragment(此)中实例化TimePickerFragment时传递活动代码>我应该在哪里添加代码?我有点不明白。是否应该在if(ifChecked)中?正确,如果您只想在用户打开开关/复选框时打开对话框,代码需要在那里。非常感谢,这对我帮助很大,只需将onDismissListener更改为onCancelListener,因为即使在我尝试设置时间之后,onDismissListener也会启动