Android DatePickerDialog API 23 (Android 6)

Я запускаю DatePickerDialog, он работает и показывает нормально до API 22 (Android 5.1), я устанавливаю на нем смешанные и максимальные даты (минимум = текущая дата, максимум = 1 месяц, начиная с текущей даты), но он просто показывает текущую дату в Api 23 я прикрепил код и изображения.

///////////////////////////////datepickerdialog///////////////////////////////
public static class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener{

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState){
        final Calendar calendar = Calendar.getInstance();
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH);
        int day = calendar.get(Calendar.DAY_OF_MONTH);

        /*
            Create a DatePickerDialog using Theme.

                DatePickerDialog(Context context, int theme, DatePickerDialog.OnDateSetListener listener,
                    int year, int monthOfYear, int dayOfMonth)
         */

        // DatePickerDialog THEME_DEVICE_DEFAULT_LIGHT
        DatePickerDialog dpd = new DatePickerDialog(getActivity(),this,year,month,day);

        if (Build.VERSION.SDK_INT < 22){

            dpd.getDatePicker().setCalendarViewShown(true);
            dpd.getDatePicker().setSpinnersShown(false);
            dpd.getDatePicker().getCalendarView().setShowWeekNumber(false);

        }

        calendar.setTimeInMillis(calendar.getTimeInMillis());
        long mindate = calendar.getTime().getTime();
        calendar.add(Calendar.MONTH, 1);
        long maxdate = calendar.getTime().getTime();

        dpd.getDatePicker().setMinDate(mindate);
        dpd.getDatePicker().setMaxDate(maxdate);

        dpd.getDatePicker().setMinDate(mindate);

        if(Build.VERSION.SDK_INT < 23){

            dpd.setTitle("");

        }

        // Return the DatePickerDialog
        return  dpd;
    }

    @SuppressLint("SimpleDateFormat")
    public void onDateSet(DatePicker view, int year, int month, int day){
        // Do something with the chosen date

        month++;

        evento_fecha = year+"-"+month+"-"+day;          


        month--;

        datetime.set(Calendar.YEAR, year);
        datetime.set(Calendar.MONTH, month);
        datetime.set(Calendar.DAY_OF_MONTH, day);

        SimpleDateFormat mSDF = new SimpleDateFormat("dd/MM/yyyy");
        fecha = mSDF.format(datetime.getTime());

        //fecha_seleccionada.setText(dia+"/"+mes+"/"+year);
        fecha_seleccionada.setText(fecha);

    }
} 

Android 5.1

Андроид 6

ОТВЕТ 1: РезультатыОТВЕТ 1: Результаты


person Jose Ricardo Citerio Alcala    schedule 25.06.2016    source источник
comment
Хорошо, я тестирую на Samsung Android 4.1 и получаю ошибки, см. изображение выше (в вопросе)   -  person Jose Ricardo Citerio Alcala    schedule 25.06.2016
comment
какой код вы используете ??   -  person Harshad Pansuriya    schedule 25.06.2016
comment
Ошибка в этих строках: long mindate = System.currentTimeMillis(); dpd.getDatePicker().setMinDate(mindate);   -  person Jose Ricardo Citerio Alcala    schedule 25.06.2016
comment
Я использую ваши строки для установки минимальной и максимальной дат   -  person Jose Ricardo Citerio Alcala    schedule 25.06.2016
comment
см. мой ответ обновления.   -  person Harshad Pansuriya    schedule 25.06.2016
comment
Хорошо, я соберу эти строки в одну строку.   -  person Jose Ricardo Citerio Alcala    schedule 25.06.2016
comment
ты понял или нет??   -  person Harshad Pansuriya    schedule 25.06.2016
comment
Я иду спать прямо сейчас, в моей стране почти 3 часа ночи, я попробую позже и дам вам знать, спасибо   -  person Jose Ricardo Citerio Alcala    schedule 25.06.2016
comment
Приятель, я все еще получаю ту же ошибку в этой строке: dpd.getDatePicker().setMinDate(System.currentTimeMillis());   -  person Jose Ricardo Citerio Alcala    schedule 25.06.2016
comment
Я отредактировал свой код, я забыл несколько строк. Это мой исходный код для установки минимальной максимальной даты   -  person Jose Ricardo Citerio Alcala    schedule 25.06.2016
comment
Эта проблема связана с темой, которую я использую?   -  person Jose Ricardo Citerio Alcala    schedule 25.06.2016
comment
Ознакомьтесь с этим сообщением stackoverflow.com/questions/13661788/   -  person Jose Ricardo Citerio Alcala    schedule 25.06.2016


Ответы (3)


DatePicker / DatePickerDialog не отображается должным образом на Android Marshmallow / API 23 — это проблема темы. Я предлагаю вместо использования темы по умолчанию или написания пользовательских стилей создать экземпляр DatePickerDialog с помощью параметра theme:

DatePickerDialog(Context context, int theme, DatePickerDialog.OnDateSetListener listener, int year, int monthOfYear, int dayOfMonth)

API 23 и выше, для диалога следует использовать тему материала. Используйте android.R.style.Theme_Material_Light_Dialog_Alert для параметра темы.

Для Xamarin Android — используйте Android.Resource.Style.ThemeMaterialLightDialogAlert.

person Sumant    schedule 25.07.2016

Я использовал этот стиль в своей теме:

<style name="AppTheme" parent="Theme.AppCompat.Light">
    <!-- All customizations that are NOT specific to a particular API-level can go here. -->
    <item name="colorPrimary">@color/green_sheet</item>
    <item name="android:textColorPrimary">@color/textColorPrimary</item>
    <item name="android:textAllCaps">false</item>     

</style> 

Свойство textColorPrimary показывало все номера дней белым цветом, я использовал это свойство, чтобы сделать текст панели действий белым. Я был неправ, потому что для этой цели мне пришлось использовать Theme.AppCompat.Light.DarkActionBar, поэтому я изменил стиль своей темы на это:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- All customizations that are NOT specific to a particular API-level can go here. -->
    <item name="colorPrimary">@color/green_sheet</item>

    <item name="android:textAllCaps">false</item>     

</style>

и результат был ожидаемым.

person Jose Ricardo Citerio Alcala    schedule 26.06.2016

В DatePicker вы установили MinDate на currentTimeMillis(), а в MaxDate добавили 1 MONTH к Calendar.

Просто используйте этот код.

public class MainActivity extends Activity {

    int mYear, mMonth, mDay;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        final Calendar c = Calendar.getInstance();
        mYear = c.get(Calendar.YEAR);
        mMonth = c.get(Calendar.MONTH);
        mDay = c.get(Calendar.DAY_OF_MONTH);

        final TextView textView = (TextView)findViewById(R.id.textview_totalStone);
        textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                DatePickerDialog dpd = new DatePickerDialog(MainActivity.this,
                        new DatePickerDialog.OnDateSetListener() {
                            @Override
                            public void onDateSet(DatePicker view, int year, int month, int day) {
                                c.set(year, month, day);
                                String date = new SimpleDateFormat("MM/dd/yyyy").format(c.getTime());
                                textView.setText(date);

                                mYear = c.get(Calendar.YEAR);
                                mMonth = c.get(Calendar.MONTH);
                                mDay = c.get(Calendar.DAY_OF_MONTH);
                            }
                        }, mYear, mMonth, mDay);
                dpd.getDatePicker().setMinDate(System.currentTimeMillis());

                Calendar d = Calendar.getInstance();
                d.add(Calendar.MONTH,1);

                dpd.getDatePicker().setMaxDate(d.getTimeInMillis());
                dpd.show();


            }

        });

    }

В моем DatePicker у меня есть дата June 25, и она выбрана, и по вашему требованию у вас есть MaxDate 1 месяц, который отображается на скриншоте.

Снимок экрана: 1

введите здесь описание изображения

Снимок экрана: 2

введите здесь описание изображения

Обновление:

Замените этот код

calendar.setTimeInMillis(calendar.getTimeInMillis());
        long mindate = calendar.getTime().getTime();

        dpd.getDatePicker().setMinDate(mindate);

с этим

  dpd.getDatePicker().setMinDate(System.currentTimeMillis());
person Harshad Pansuriya    schedule 25.06.2016
comment
Я протестировал свой код (тот, что в вопросе) на эмуляторе Android, и он отлично работает, календарь выглядит как ваш, но на реальных устройствах. (фотографии, которые я прикрепил выше, принадлежат телефону Motorola g3) - person Jose Ricardo Citerio Alcala; 26.06.2016
comment
Это проблема темы, дни недели отображаются белым, а не черным (разрешено) и серым (не разрешено) - person Jose Ricardo Citerio Alcala; 26.06.2016
comment
Представьте, что в вашем примере все числа дней белые, но текущая дата - person Jose Ricardo Citerio Alcala; 26.06.2016
comment
@ user4216713, потому что он выбран Date, поэтому его цвет White. - person Harshad Pansuriya; 26.06.2016
comment
Это был хороший ответ, но мой код был в порядке, как я уже сказал, это была проблема (Api 23), связанная с темой приложения. - person Jose Ricardo Citerio Alcala; 26.06.2016