尝试创建一个简单的时间选择器来填充按钮时,我在下面遇到了这段代码,似乎是我在寻找的东西-但在运行时崩溃。你们可以指出问题还是提供更好的代码。提前致谢。

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    tools:context=".MainActivity"
    >
    <TextView
        android:id="@+id/tv"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        />
    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onButtonClicked"
        android:text="Set Time"
        android:layout_below="@id/tv"
        />
</RelativeLayout>


这是代码

package com.example.xxxx;

import android.app.AlertDialog;
import android.app.TimePickerDialog;
import android.graphics.Color;
import android.os.Bundle;
import android.app.Fragment;
import android.text.format.DateFormat;
import android.view.Gravity;
import android.widget.TextView;
import android.app.DialogFragment;
import android.app.Dialog;
import java.util.Calendar;
import android.widget.TimePicker;


/**
 * A simple {@link Fragment} subclass.
 */
public class MainActivity extends DialogFragment implements TimePickerDialog.OnTimeSetListener{

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

        //Create and return a new instance of TimePickerDialog
        /*
            public constructor.....
            TimePickerDialog(Context context, int theme,
             TimePickerDialog.OnTimeSetListener callBack, int hourOfDay, int minute, boolean is24HourView)

            The 'theme' parameter allow us to specify the theme of TimePickerDialog

            .......List of Themes.......
            THEME_DEVICE_DEFAULT_DARK
            THEME_DEVICE_DEFAULT_LIGHT
            THEME_HOLO_DARK
            THEME_HOLO_LIGHT
            THEME_TRADITIONAL

         */
        TimePickerDialog tpd = new TimePickerDialog(getActivity(), AlertDialog.THEME_DEVICE_DEFAULT_DARK
                ,this, hour, minute, DateFormat.is24HourFormat(getActivity()));

        //You can set a simple text title for TimePickerDialog
        //tpd.setTitle("Title Of Time Picker Dialog");

        /*.........Set a custom title for picker........*/
        TextView tvTitle = new TextView(getActivity());
        tvTitle.setText("TimePickerDialog Title");
        tvTitle.setBackgroundColor(Color.parseColor("#EEE8AA"));
        tvTitle.setPadding(5, 3, 5, 3);
        tvTitle.setGravity(Gravity.CENTER_HORIZONTAL);
        tpd.setCustomTitle(tvTitle);
        /*.........End custom title section........*/

        return tpd;
    }

    //onTimeSet() callback method
    public void onTimeSet(TimePicker view, int hourOfDay, int minute){
        //Do something with the user chosen time
        //Get reference of host activity (XML Layout File) TextView widget
        TextView tv = (TextView) getActivity().findViewById(R.id.tv);
        //Set a message for user

        //Get the AM or PM for current time
        String aMpM = "AM";
        if(hourOfDay >11)
        {
            aMpM = "PM";
        }

        //Make the 24 hour time format to 12 hour time format
        int currentHour;
        if(hourOfDay>11)
        {
            currentHour = hourOfDay - 12;
        }
        else
        {
            currentHour = hourOfDay;
        }

        tv.setText("Your chosen time is...\n\n");
        //Display the user changed time on TextView
        tv.setText(tv.getText()+ String.valueOf(currentHour)
                + " : " + String.valueOf(minute) + " " + aMpM + "\n");

    }


错误记录

02-17 08:58:46.497: E/AndroidRuntime(21811): FATAL EXCEPTION: main
02-17 08:58:46.497: E/AndroidRuntime(21811): Process: com.example.xxxx, PID: 21811
02-17 08:58:46.497: E/AndroidRuntime(21811): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.xxxx/com.example.xxxx.MainActivity}: java.lang.ClassCastException: com.example.xxxx.MainActivity cannot be cast to android.app.Activity
02-17 08:58:46.497: E/AndroidRuntime(21811):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3093)
02-17 08:58:46.497: E/AndroidRuntime(21811):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349)
02-17 08:58:46.497: E/AndroidRuntime(21811):    at android.app.ActivityThread.access$1100(ActivityThread.java:221)
02-17 08:58:46.497: E/AndroidRuntime(21811):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
02-17 08:58:46.497: E/AndroidRuntime(21811):    at android.os.Handler.dispatchMessage(Handler.java:102)
02-17 08:58:46.497: E/AndroidRuntime(21811):    at android.os.Looper.loop(Looper.java:158)
02-17 08:58:46.497: E/AndroidRuntime(21811):    at android.app.ActivityThread.main(ActivityThread.java:7224)
02-17 08:58:46.497: E/AndroidRuntime(21811):    at java.lang.reflect.Method.invoke(Native Method)
02-17 08:58:46.497: E/AndroidRuntime(21811):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
02-17 08:58:46.497: E/AndroidRuntime(21811):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
02-17 08:58:46.497: E/AndroidRuntime(21811): Caused by: java.lang.ClassCastException: com.example.xxxx.MainActivity cannot be cast to android.app.Activity
02-17 08:58:46.497: E/AndroidRuntime(21811):    at android.app.Instrumentation.newActivity(Instrumentation.java:1095)
02-17 08:58:46.497: E/AndroidRuntime(21811):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3083)
02-17 08:58:46.497: E/AndroidRuntime(21811):    ... 9 more

最佳答案

为此使用自定义布局。您必须在其中按下以下按钮:time_picker_dialod.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@color/accentcolor"
    android:padding="8dp">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/date_time_set">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginTop="10dp"
            android:orientation="vertical">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="10dp"
                android:text="Select Time"
                android:textSize="14sp"
                android:textStyle="bold" />

            <TimePicker
                android:id="@+id/time_picker"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
        </LinearLayout>
    </ScrollView>

    <Button
        android:id="@+id/date_time_set"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:text="Set Time" />

</RelativeLayout>


现在,您可以在对话框中使用此布局,如下所示

ProgressDialog progressDialog = new ProgressDialog(Add_ReminderActivity.this);
                progressDialog.setMessage("Please wait.");
                progressDialog.show();

                final View dialogView = View.inflate(Add_ReminderActivity.this, R.layout.time_picker_dialod, null);

                final AlertDialog alertDialog = new AlertDialog.Builder(Add_ReminderActivity.this).create();
                alertDialog.setView(dialogView);

                final TimePicker timePicker = (TimePicker) dialogView.findViewById(R.id.time_picker);

                if (Build.VERSION.SDK_INT >= 23) {
                    timePicker.setHour(00);
                    timePicker.setMinute(00);
                } else {
                    timePicker.setCurrentHour(00);
                    timePicker.setCurrentMinute(00);
                }

                dialogView.findViewById(R.id.date_time_set).setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {

                        if (Build.VERSION.SDK_INT >= 23) {
                            Selected_From_Time = Uri.encode(DigitPad(timePicker.getHour()) + ":" + DigitPad(timePicker.getMinute()) + ":" + "00");
                        } else {
                            Selected_From_Time = Uri.encode(DigitPad(timePicker.getCurrentHour()) + ":" + DigitPad(timePicker.getCurrentMinute()) + ":" + "00");
                        }

                        alertDialog.dismiss();
                    }
                });

                alertDialog.show();
                if (alertDialog.isShowing()) {
                    progressDialog.dismiss();
                }


DigitPad功能:

public String DigitPad(int myNumber) {
        String mNumber = String.valueOf(myNumber);
        return (mNumber.toString().length() < 2) ? "0" + mNumber : mNumber;
    }


希望这对您有帮助

09-13 12:08