簡體   English   中英

DialogFragment timepicker onCancel 和 onDismiss 問題

[英]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);
    }
}

我已經嘗試過onDismissonCancel ,但都沒有在這里工作,如果取消時間選擇器,是否有任何解決方案可以使 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM