【问题标题】:setTitle for DatePickerDialog is not workingDatePickerDialog 的 setTitle 不起作用
【发布时间】:2020-07-28 20:32:29
【问题描述】:

我一直在尝试制作 DatePickerDialog 和 TimePickerDialog 以在顶部显示标题,但到目前为止没有任何效果。在显示日期/时间选择器之前,我尝试使用 setTitle,还尝试了 setCustomTitle。 这是我的 Dialog 类,用于显示基于 this answer 的日期选择器和时间选择器。

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

我尝试覆盖 here 中提到的 setTitle 方法,分别使用 setTitle 和 setCustomTitle 并结合使用,我在 SO 上找到了所有可以找到的方法,但到目前为止没有任何效果。当我调试我的代码时,我注意到当调用 setTitle 时,光标会跳转到 AlertDialog.java 上的 setTitle,然后跳转到 PhoneWindow.java 的以下方法,其中 mViewTitle 为空。我认为可能是这样,但无法弄清楚如何解决它。

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

感谢您的帮助

【问题讨论】:

    标签: java android android-studio datepickerdialog


    【解决方案1】:

    创建DatePickerDialog时需要设置一个主题,然后标题就会显示出来。

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

    【讨论】:

      猜你喜欢
      • 2016-04-07
      • 2015-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多