잡동사니

반응형

질문

나는 DatePickerDialog와 TimePickerDialog를 만들어 제목을 맨 위에 표시하려고 시도했지만 지금까지는 아무것도 작동하지 않았습니다. 날짜 / 시간 선택자를 표시하기 전에 setTitle을 사용해 보았고 setCustomTitle도 시도했습니다.다음은 이 답변 을 기반으로 날짜 선택자 및 시간 선택자를 표시하는 데 사용하는 대화 class입니다.

DateTimePickerDialog.java

import android.app.DatePickerDialog;
import android.app.TimePickerDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.widget.DatePicker;
import android.widget.TextView;
import android.widget.TimePicker;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import java.util.Calendar;


public class DateTimePicker extends DatePickerDialog {

    @NonNull
    private Calendar calendar = Calendar.getInstance();
    @Nullable
    private DatePickerDialog datePickerDialog;
    @Nullable
    private TimePickerDialog timePickerDialog;

    private String pickerTitle;
    private TextView customTitle;


    public DateTimePicker(Context context, OnDateSetListener dateListener, int year, int monthOfYear, int dayOfMonth) {
        super(context, dateListener, year, monthOfYear, dayOfMonth);
    }

    public setPickerTitle(String title, TextView view){
        this.pickerTitle = title;
        this.customTitle = view;
    }

    public void showDialog(@NonNull Context context, long time) {
        calendar.setTimeInMillis(time);

        closeDialogs();
        showDatePicker(context);
    }

    private void closeDialogs() {
        if (datePickerDialog != null) {
            datePickerDialog.dismiss();
            datePickerDialog = null;
        }
        if (timePickerDialog != null) {
            timePickerDialog.dismiss();
            timePickerDialog = null;
        }
    }

    private DatePickerDialog.OnDateSetListener dateSetListener = new DatePickerDialog.OnDateSetListener() {
        @Override
        public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
            calendar.set(Calendar.YEAR, year);
            calendar.set(Calendar.MONTH, month);
            calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
            timePicker(view.getContext());
            dateListener.onDateSet(view, year, month, dayOfMonth);

        }
    };

    private TimePickerDialog.OnTimeSetListener timeSetListener = new TimePickerDialog.OnTimeSetListener() {

        @Override
        public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
            calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
            calendar.set(Calendar.MINUTE, minute);
            timeListener.onTimeSet(view, hourOfDay, minute);
        }

    };

    private void showDatePicker(@NonNull Context context) {
        datePickerDialog = new DatePickerDialog(context,
                dateSetListener,
                calendar.get(Calendar.YEAR),
                calendar.get(Calendar.MONTH),
                calendar.get(Calendar.DAY_OF_MONTH));
        
        datePickerDialog.setTitle(this.pickerTitle);        
        datePickerDialog.show();
    }

    private void timePicker(@NonNull Context context) {
        timePickerDialog = new TimePickerDialog(context,
                timeSetListener,
                calendar.get(Calendar.HOUR_OF_DAY),
                calendar.get(Calendar.MINUTE),
                true);

        timePickerDialog.setCustomTitle(this.customTitle);
        timePickerDialog.show();
    }

}

그리고 이것이 내 Fragment에서 사용하는 방법입니다.

    private void onDateTimeClick(){

    DateTimePicker dateTimePicker = new DateTimePicker(getContext(), onDateSetListener, Calendar.YEAR, Calendar.MONTH, Calendar.DAY_OF_MONTH);

    TextView view = new TextView(getContext());
    view.setText("Custom title");
    dateTimePicker.setPickerTitle("My title", view);

    dateTimePicker.showDialog(Objects.requireNonNull(getContext()), Calendar.getInstance().getTimeInMillis());
}

여기 에서 언급했듯이 setTitle 메서드를 재정의하려고 시도하고 setTitle과 setCustomTitle을 개별적으로 사용하고 결합하여 내가 찾을 수있는 모든 것을 통해 지금까지 아무것도 작동하지 않았습니다. 코드를 디버깅 할 때 setTitle이 호출되면 커서가 AlertDialog.java의 setTitle로 이동 한 다음 mViewTitle이 null 인 PhoneWindow.java의 아래 메서드로 이동하는 것을 확인했습니다. 나는 이것이 그것일지도 모르지만 그것을 고치는 방법을 알 수 없었다.

  public void setTitle(CharSequence title, boolean updateAccessibilityTitle) {
    if (mTitleView != null) {
        mTitleView.setText(title);
    } else if (mDecorContentParent != null) {
        mDecorContentParent.setWindowTitle(title);
    }
    mTitle = title;
    if (updateAccessibilityTitle) {
        WindowManager.LayoutParams params = getAttributes();
        if (!TextUtils.equals(title, params.accessibilityTitle)) {
            params.accessibilityTitle = TextUtils.stringOrSpannedString(title);
            if (mDecor != null) {
                // ViewRootImpl will make sure the change propagates to WindowManagerService
                ViewRootImpl vr = mDecor.getViewRootImpl();
                if (vr != null) {
                    vr.onWindowTitleChanged();
                }
            }
            dispatchWindowAttributesChanged(getAttributes());
        }
    }
}

도움을 주셔서 감사합니다


답변1

DatePickerDialog 를 만들 때 테마를 설정해야하며 제목이 표시됩니다.

new DatePickerDialog(
        context,
        android.R.style.Theme_Material_Light_Dialog,
        ...
))


 

 

 

 

출처 : https://stackoverflow.com/questions/63142324/settitle-for-datepickerdialog-is-not-working

반응형

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band