GVKun编程网logo

java-无法转换为android.app.DatePickerDialog $OnDateSetListener(java无法应用转换程序)

17

本文将分享java-无法转换为android.app.DatePickerDialog$OnDateSetListener的详细内容,并且还将对java无法应用转换程序进行详尽解释,此外,我们还将为大

本文将分享java-无法转换为android.app.DatePickerDialog $OnDateSetListener的详细内容,并且还将对java无法应用转换程序进行详尽解释,此外,我们还将为大家带来关于Android 6.0 DatePickerDialog主题、Android DatePickerDialog上的最大日期、Android DatePickerDialog和TimePickerDialog显示样式、Android Datepickerdialog在不同机型上时间上下限不同的相关知识,希望对你有所帮助。

本文目录一览:

java-无法转换为android.app.DatePickerDialog $OnDateSetListener(java无法应用转换程序)

java-无法转换为android.app.DatePickerDialog $OnDateSetListener(java无法应用转换程序)

在应用程序中单击按钮时,我意外地遇到了以下错误:

 cannot be cast to android.app.DatePickerDialog$OnDateSetListener

发生的情况如下-用户单击名为“ btnCalendar”的按钮,然后显示日历

btnCalendar.setonClickListener(new OnClickListener() {
    @Override
    public void onClick(View arg0) {

        DialogP dcal = new  DialogP();
       dcal.show(ScheduleMatchOptionActivity.this.getFragmentManager(),"MyDialog");
    }
});

下面是DialogP类

public class DialogP extends DialogFragment {

    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the current date as the default date in the picker
        final Calendar c = Calendar.getInstance();
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int day = c.get(Calendar.DAY_OF_MONTH); 


        //  Create a new instance of DatePickerDialog and return it
        DatePickerDialog dialog = new DatePickerDialog(getActivity(), (OnDateSetListener) this, year, month,day);
        Log.i("onCreateDialog", "onCreateDialog : MinDate() : "+new Date().getTime());

        Calendar cal=new GregorianCalendar();

        //min date
        dialog.getDatePicker().setMinDate(cal.getTime().getTime()-1000);
        Log.i("onCreateDialog", "onCreateDialog : MinDate() : "+cal.getTime());

        //max date .... added 30 days from currunt date
        cal.add(Calendar.DATE, 30);
        Date dte =cal.getTime();
        dialog.getDatePicker().setMaxDate(dte.getTime());
        Log.i("onCreateDialog", "onCreateDialog : MaxDate() : "+dte);

        //customizing calendar view
        dialog.getDatePicker().setCalendarViewShown(true);
        dialog.getDatePicker().setSpinneRSShown(false);
        dialog.getDatePicker().getCalendarView().setShowWeekNumber(false);
        dialog.setCancelable(true);

        Log.i("Date", "date : "+System.currentTimeMillis());
        return dialog;
    }
}

以下是日志猫消息

 09-30 16:12:00.805: E/AndroidRuntime(1415): FATAL EXCEPTION: main
    09-30 16:12:00.805: E/AndroidRuntime(1415): java.lang.classCastException: com.dooba.beta.DialogP cannot be cast to android.app.DatePickerDialog$OnDateSetListener
    09-30 16:12:00.805: E/AndroidRuntime(1415):     at com.dooba.beta.DialogP.onCreateDialog(DialogP.java:25)
    09-30 16:12:00.805: E/AndroidRuntime(1415):     at android.app.DialogFragment.getLayoutInflater(DialogFragment.java:398)
    09-30 16:12:00.805: E/AndroidRuntime(1415):     at android.app.FragmentManagerImpl.movetoState(FragmentManager.java:885)
    09-30 16:12:00.805: E/AndroidRuntime(1415):     at android.app.FragmentManagerImpl.movetoState(FragmentManager.java:1057)
    09-30 16:12:00.805: E/AndroidRuntime(1415):     at android.app.BackStackRecord.run(BackStackRecord.java:682)
    09-30 16:12:00.805: E/AndroidRuntime(1415):     at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1435)
    09-30 16:12:00.805: E/AndroidRuntime(1415):     at android.app.FragmentManagerImpl$1.run(FragmentManager.java:441)
    09-30 16:12:00.805: E/AndroidRuntime(1415):     at android.os.Handler.handleCallback(Handler.java:730)
    09-30 16:12:00.805: E/AndroidRuntime(1415):     at android.os.Handler.dispatchMessage(Handler.java:92)
    09-30 16:12:00.805: E/AndroidRuntime(1415):     at android.os.Looper.loop(Looper.java:137)
    09-30 16:12:00.805: E/AndroidRuntime(1415):     at android.app.ActivityThread.main(ActivityThread.java:5103)
    09-30 16:12:00.805: E/AndroidRuntime(1415):     at java.lang.reflect.Method.invokeNative(Native Method)
    09-30 16:12:00.805: E/AndroidRuntime(1415):     at java.lang.reflect.Method.invoke(Method.java:525)
    09-30 16:12:00.805: E/AndroidRuntime(1415):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
    09-30 16:12:00.805: E/AndroidRuntime(1415):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    09-30 16:12:00.805: E/AndroidRuntime(1415):     at dalvik.system.NativeStart.main(Native Method)

第25行如下:

DatePickerDialog dialog = new DatePickerDialog(getActivity(), (OnDateSetListener) this, year, month,day);

在我去之前

 DatePickerDialog dialog = new DatePickerDialog(getActivity(), this, year, month,day); 

但收到以下错误“未定义构造函数DatePickerDialog(Activity,DialogP,int,int,int)”,因此我将其强制转换.

我想检索另一个日期相关的问题,并将日期转换为显示给用户的名为txtDate的文本视图.我对settext很熟悉,但有点困惑.

任何帮助将不胜感激.提前致谢

更新:

cal.add(Calendar.DATE,7);
如果数字小于12,则发生以下错误:

ALL i want to do is to limit the calendar to one week
    09-30 16:39:07.217: E/AndroidRuntime(2410): FATAL EXCEPTION: main
    09-30 16:39:07.217: E/AndroidRuntime(2410): java.lang.NullPointerException
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.widget.CalendarView.onScroll(CalendarView.java:1214)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.widget.CalendarView.access$900(CalendarView.java:76)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.widget.CalendarView$2.onScroll(CalendarView.java:1075)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.widget.AbsListView.invokeOnItemScrollListener(AbsListView.java:1340)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.widget.ListView.layoutChildren(ListView.java:1762)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.widget.AbsListView.onLayout(AbsListView.java:2012)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.view.View.layout(View.java:14289)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.view.View.layout(View.java:14289)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.view.View.layout(View.java:14289)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.view.ViewGroup.layout(ViewGroup.java:4562)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1660)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.widget.LinearLayout.onLayout(LinearLayout.java:1436)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.view.View.layout(View.java:14289)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.view.ViewGroup.layout(ViewGroup.java:4562)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.view.View.layout(View.java:14289)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.view.ViewGroup.layout(ViewGroup.java:4562)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.view.View.layout(View.java:14289)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.view.ViewGroup.layout(ViewGroup.java:4562)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.view.View.layout(View.java:14289)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.view.ViewGroup.layout(ViewGroup.java:4562)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.view.View.layout(View.java:14289)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.view.ViewGroup.layout(ViewGroup.java:4562)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.view.View.layout(View.java:14289)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.view.ViewGroup.layout(ViewGroup.java:4562)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.view.View.layout(View.java:14289)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.view.ViewGroup.layout(ViewGroup.java:4562)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.view.View.layout(View.java:14289)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.view.ViewGroup.layout(ViewGroup.java:4562)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1730)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5481)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.view.Choreographer.doCallbacks(Choreographer.java:562)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.view.Choreographer.doFrame(Choreographer.java:532)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.view.Choreographer$FramedisplayEventReceiver.run(Choreographer.java:735)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.os.Handler.dispatchMessage(Handler.java:92)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.os.Looper.loop(Looper.java:137)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at android.app.ActivityThread.main(ActivityThread.java:5103)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at java.lang.reflect.Method.invokeNative(Native Method)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at java.lang.reflect.Method.invoke(Method.java:525)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    09-30 16:39:07.217: E/AndroidRuntime(2410):     at dalvik.system.NativeStart.main(Native Method)

解决方法:

确保在ScheduleMatchOptionActivity活动中实现OnDateSetListener:

public class ScheduleMatchOptionActivity extends FragmentActivity 
          implements DatePickerDialog.OnDateSetListener {
....you code here..
}

而不是将getActivity()强制转换为OnDateSetListener,而是将其强制转换为ScheduleMatchOptionActivity,因为您正在ScheduleMatchOptionActivity中实现OnDateSetListener接口:

DatePickerDialog dialog = new DatePickerDialog(getActivity(), 
                    (ScheduleMatchOptionActivity)getActivity(), year, month,day);

Android 6.0 DatePickerDialog主题

Android 6.0 DatePickerDialog主题

似乎任何使用Marshmallow( Android 6.0)的人都无法在我的应用程序中使用DatePicketDialog.似乎遇到了某种我遇到的主题问题.我使用DialogFragment,它包含一个DatePicketDialog供用户选择生日.以下是Android 5.x和6.x的DialogFragment镜头.


我试图在DatePickerDialog构造函数中添加一个主题,但这使得DialogFragment全屏,我不希望这样.有谁知道我怎么能让DatePickerDialog看起来像是在Marshmallow之前?

更新1

这是我创建DialogFragment的代码:

DialogFragment ageFragment = new DatePickerDialogFragment();
ageFragment.show(getFragmentManager(),"datePicker");

这是DatePickerDialogFragment中的onCreateDialog:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    // Use the current date as the default date in the picker if no filters are set
    Calendar cal = Calendar.getInstance();
    // Set the date 18 years prevIoUs,since only 18 and older are allowed on the app
    cal.add(Calendar.YEAR,-18);
    int year,month,day;
    if (iDialogListener.getYear() == -1 || iDialogListener.getMonth() == -1
            || iDialogListener.getDay() == -1) {
        Calendar defaultCal = Calendar.getInstance();
        // 40 is the default age to show
        defaultCal.add(Calendar.YEAR,-40);
        year = defaultCal.get(Calendar.YEAR);
        month = defaultCal.get(Calendar.MONTH);
        day = defaultCal.get(Calendar.DAY_OF_MONTH);
    } else {
        year = iDialogListener.getYear();
        month = iDialogListener.getMonth();
        day = iDialogListener.getDay();
    }

    DatePickerDialog datepicker = new DatePickerDialog(getActivity(),this,year,day);
    datepicker.getDatePicker().setMaxDate(cal.getTimeInMillis());
    Calendar minDate = Calendar.getInstance();
    minDate.set(Calendar.YEAR,Calendar.getInstance().get(Calendar.YEAR) - 100);
    datepicker.getDatePicker().setMinDate(minDate.getTimeInMillis());

    // Create a new instance of DatePickerDialog and return it
    return datepicker;
}

在themes.xml中,唯一触及Dialogs的行是

<item name="android:alertDialogTheme">@style/CustomDialogTheme</item>

但是,如果我正在思考,那不会触及DialogFragment吗?

更新2

这是CustomDialogTheme:

<style name="CustomDialogTheme" parent="@android:style/Theme.Holo.Light.Dialog">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowMinWidthMajor">@android:dimen/dialog_min_width_major</item>
    <item name="android:windowMinWidthMinor">@android:dimen/dialog_min_width_minor</item>
</style>

解决方法

感谢 How to change the style of Date picker in android?后,我能够正确显示DatePicker.在为DatePicker设置样式时,我不得不使用parent =“Theme.AppCompat.Light.Dialog”

Android DatePickerDialog上的最大日期

Android DatePickerDialog上的最大日期

我需要在我正在使用的DatePickerDialog上设置最大年份,但我无法找到任何这样做的机制.该文档提到getDatePicker()作为DatePickerDialog的公共方法.所以,我想,也许,可以用来获取DatePicker,然后我可以设置最大日期,但是当我尝试获取DatePicker时,我得到“方法未定义”错误.

这就是我试图在我的onCreateDialog中获取DatePicker的方法.

DatePickerDialog d = new DatePickerDialog(this, dep_dateListener, mYear,
                      mMonth, mDay);
DatePicker dp = d.getDatePicker();
dp.setMaxDate(maxDate);
return d;

有关如何做到这一点的任何指示?

谢谢

解决方法:

API Level 11中提供了getDatePicker()方法.

Android DatePickerDialog和TimePickerDialog显示样式

Android DatePickerDialog和TimePickerDialog显示样式

可以用DatePickerDialog显示选取日期的对话框。可以设置显示的样式

 

1、通过构造方法设置显示样式。

  可以通过DatePickerDialog(Context context, int theme, DatePickerDialog.OnDateSetListener callBack, int year, int monthOfYear, int dayOfMonth)这个构造方法的第二个参数来设置显示样式。

  这个theme参数对应的值,可以使用AlertDialog中的theme值。

  AlertDialog.THEME_TradITIONAL

    

  AlertDialog.THEME_HOLO_DARK

    

  AlertDialog.THEME_HOLO_LIGHT

    

  AlertDialog.THEME_DEVICE_DEFAULT_DARK

    

  AlertDialog.THEME_DEVICE_DEFAULT_LIGHT

    

 

2、通过DatePicker设置显示样式

  首先获取DatePicker,然后使用DatePicker.setCalendarViewShow(boolean)和DatePicker.setSpinneRSShow(boolean)来设置。

  CalendarView和Spinners的值分别为true和false

    

  CalendarView和Spinners的值分别为false和true

    

  CalendarView和Spinners的值都是false

    

  CalendarView和Spinners的值都是true

    

 

 

对于TimePickerDialog而言,它的样式设置,只有构造函数一种方式,对应的theme参数和DatePickerDialog相同。它内部定义了一个TimePicker,但是没有提供获取的方式。

 

在构造TimePickerDialog和DatePickerDialog的时候最好使用DialogFragment来进行构造。

帮助文档中例子:

复制代码

public static class TimePickerFragment extends DialogFragment
                            implements TimePickerDialog.OnTimeSetListener {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the current time as the default values for the picker
        final Calendar c = Calendar.getInstance();
        int hour = c.get(Calendar.HOUR_OF_DAY);
        int minute = c.get(Calendar.MINUTE);

        // Create a new instance of TimePickerDialog and return it
        return new TimePickerDialog(getActivity(), this, hour, minute,
                DateFormat.is24HourFormat(getActivity()));
    }

    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
        // Do something with the time chosen by the user
    }
}

复制代码

public void showTimePickerDialog(View v) {
    DialogFragment newFragment = new TimePickerFragment();
    newFragment.show(getSupportFragmentManager(), "timePicker");
}

 

对于DialogFragment可以参考文档: Android 官方推荐 : DialogFragment 创建对话框

Android Datepickerdialog在不同机型上时间上下限不同

Android Datepickerdialog在不同机型上时间上下限不同

通过设置整个App的Theme可以设置统一Datepickerdialog的时间上下限。

修改应用主题

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" 
    android:theme="@style/AppTheme">
    <activity
        android:name=".XXActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
 </application>

修改 styles.xml

<style name="CustomTheme" parent="android:Theme.Light">
    <item name="android:endYear">2999</item>
    <item name="android:startYear">1000</item>
</style>


我们今天的关于java-无法转换为android.app.DatePickerDialog $OnDateSetListenerjava无法应用转换程序的分享已经告一段落,感谢您的关注,如果您想了解更多关于Android 6.0 DatePickerDialog主题、Android DatePickerDialog上的最大日期、Android DatePickerDialog和TimePickerDialog显示样式、Android Datepickerdialog在不同机型上时间上下限不同的相关信息,请在本站查询。

本文标签: