繁体   English   中英

DatePickerDialog 的 setTitle 不起作用

[英]setTitle for DatePickerDialog is not working

我一直在尝试制作 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();
    }

}

这就是我在片段中使用它的方式:

    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,然后我遍历了所有我能在 SO 上找到的内容,但到目前为止没有任何效果。 当我调试我的代码时,我注意到当调用 setTitle 时,cursor 跳转到 AlertDialog.java 上的 setTitle,然后跳转到 PhoneWindow.java 的以下方法,其中 mViewTitle 是 null。我想这可能是它,但不知道如何要解决这个问题。

  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());
        }
    }
}

谢谢你的帮助

您需要在创建DatePickerDialog时设置主题,标题才会显示出来。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM