[英]Overriding onDismiss or onCancel doesn't work in DialogFragment
[英]DialogFragment timepicker onCancel and onDismiss problem
我試圖實現一個由 SwitchCompat 打開的時間選擇器,所以當我啟用該選項時,時間選擇器會出現,它工作正常,但如果我按下取消、后退按鈕或只是在時間選擇器之外按下,開關保持在 ON 位置,當我沒有在 Time Picker 中選擇時間時,我希望它回到 OFF 狀態。 認為 onCancel 方法可能會有所幫助但它沒有,或者只是我在實現它時犯了一些錯誤,有相關的代碼:
public class Settings extends AppCompatActivity implements TimePickerDialog.OnTimeSetListener, TimePickerDialog.OnDismissListener, TimePickerDialog.OnCancelListener {
private EditText textLastHour;
private KeyListener keyListener;
private SwitchCompat hourSwitch;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
textLastHour = findViewById(R.id.finalHourText);
textLastHour.setKeyListener(null);
textLastHour.setHint("Option not selected");
hourSwitch = findViewById(R.id.switch_hour);
hourSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
DialogFragment timePicker = new TimePickerFragment();
timePicker.show(getSupportFragmentManager(), "time picker");
} else {
textLastHour.setText("");
}
}
});
}
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
textLastHour = findViewById(R.id.finalHourText);
textLastHour.setText("Final alarm at: " + hourOfDay + ":" + minute);
}
@Override
public void onCancel(DialogInterface dialog) {
hourSwitch.setChecked(false);
}
@Override
public void onDismiss(DialogInterface dialog) {
hourSwitch.setChecked(false);
}
}
我已經嘗試過onDismiss
和onCancel
,但都沒有在這里工作,如果取消時間選擇器,是否有任何解決方案可以使 Switch 回到原始位置? 將DatePicker
添加到標簽,因為我覺得它可能具有與TimePicker
相同的解決方案。
我的TimePickerFragment
類:
public class TimePickerFragment extends DialogFragment {
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Calendar c = Calendar.getInstance();
int hour = c.get(Calendar.HOUR_OF_DAY);
int minute = c.get(Calendar.MINUTE);
return new TimePickerDialog(getActivity(), (TimePickerDialog.OnTimeSetListener) getActivity(), hour, minute, DateFormat.is24HourFormat(getActivity()));
}
}
它實際上比我想象的要簡單,您需要做的就是添加一個解除監聽器並相應地更改您的用戶界面/邏輯
TimePickerDialog dialog = new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
}
}, 10, 10, true);
dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
Toast.makeText(MainActivity.this, "dismissed", Toast.LENGTH_LONG).show();
}
});
dialog.show();
您可以使用標准的 TimePickerDialog
編輯:將除dialog.show()
onCreate()
之外的所有內容都放到onCreate()
, dialog.show()
進入 Switch 中的 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");
}
在此之后在您的覆蓋 onDismiss() 中設置listener.onComplete(false);
在那里面。 每當 TimePickerFragment 想要成功完成時,只需設置listener.onComplete(true);
現在我們將回到 MainActivity。 首先讓 MainActivity 實現TimePickerFragment.OnCompleteListener
。
現在您需要覆蓋OnCompleteListener
的抽象函數。 簡單地說,如果參數為假,則意味着對話框未成功關閉,因此使用簡單的 if 條件以編程方式將您的Switch
設置為關閉。
希望我能幫上忙。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.