Custom DatePicker in Android?

后端 未结 4 801
臣服心动
臣服心动 2020-12-14 13:04

How to make the datepicker in spin view. Here is the image, \"enter

I want the datepi

4条回答
  •  半阙折子戏
    2020-12-14 13:46

    activity_main.xml

    
    
    
    

    datepickerdialog.java

    import java.util.Calendar;
    import android.app.Dialog;
    import android.content.Context;
    import android.graphics.Typeface;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.Window;
    import android.widget.Button;
    import android.widget.LinearLayout;
    import android.widget.TableLayout.LayoutParams; 
    import android.widget.TextView;
    import com.wheel.ArrayWheelAdapter;
    import com.wheel.NumericWheelAdapter;
    import com.wheel.OnWheelChangedListener; 
    import com.wheel.WheelView;
    
    public class DatePickerDailog extends Dialog {
    
    private Context Mcontex;
    
    private int NoOfYear = 100;
    
    public DatePickerDailog(Context context, Calendar calendar,
            final DatePickerListner dtp) {
    
        super(context);
        Mcontex = context;
        LinearLayout lytmain = new LinearLayout(Mcontex);
        lytmain.setOrientation(LinearLayout.VERTICAL);
        LinearLayout lytdate = new LinearLayout(Mcontex);
        LinearLayout lytbutton = new LinearLayout(Mcontex);
    
        Button btnset = new Button(Mcontex);
        Button btncancel = new Button(Mcontex);
    
        btnset.setText("Set");
        btncancel.setText("Cancel");
    
        final WheelView month = new WheelView(Mcontex);
        final WheelView year = new WheelView(Mcontex);
        final WheelView day = new WheelView(Mcontex);
    
        lytdate.addView(day, new LayoutParams(
                ViewGroup.LayoutParams.FILL_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT, 1.2f));
        lytdate.addView(month, new LayoutParams(
                ViewGroup.LayoutParams.FILL_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT, 0.8f));
        lytdate.addView(year, new LayoutParams(
                ViewGroup.LayoutParams.FILL_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT, 1f));
        requestWindowFeature(Window.FEATURE_NO_TITLE);
    
        lytbutton.addView(btnset, new LayoutParams(
                ViewGroup.LayoutParams.FILL_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT, 1f));
    
        lytbutton.addView(btncancel, new LayoutParams(
                ViewGroup.LayoutParams.FILL_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT, 1f));
        lytbutton.setPadding(5, 5, 5, 5);
        lytmain.addView(lytdate);
        lytmain.addView(lytbutton);
    
        setContentView(lytmain);
    
        getWindow().setLayout(LayoutParams.FILL_PARENT,
                LayoutParams.WRAP_CONTENT);
        OnWheelChangedListener listener = new OnWheelChangedListener() {
            public void onChanged(WheelView wheel, int oldValue, int newValue) {
                updateDays(year, month, day);
    
            }
        };
    
        // month
        int curMonth = calendar.get(Calendar.MONTH);
        String months[] = new String[] { "January", "February", "March",
                "April", "May", "June", "July", "August", "September",
                "October", "November", "December" };
        month.setViewAdapter(new DateArrayAdapter(context, months, curMonth));
        month.setCurrentItem(curMonth);
        month.addChangingListener(listener);
    
        Calendar cal = Calendar.getInstance();
        // year
        int curYear = calendar.get(Calendar.YEAR);
        int Year = cal.get(Calendar.YEAR);
    
    
        year.setViewAdapter(new DateNumericAdapter(context, Year - NoOfYear,
                Year + NoOfYear, NoOfYear));
        year.setCurrentItem(curYear-(Year-NoOfYear));
        year.addChangingListener(listener);
    
        // day
        updateDays(year, month, day);
        day.setCurrentItem(calendar.get(Calendar.DAY_OF_MONTH) - 1);
    
        btnset.setOnClickListener(new View.OnClickListener() {
    
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Calendar c = updateDays(year, month, day);
                dtp.OnDoneButton(DatePickerDailog.this, c);
            }
        });
        btncancel.setOnClickListener(new View.OnClickListener() {
    
            @Override
            public void onClick(View v) {
                dtp.OnCancelButton(DatePickerDailog.this);
    
            }
        });
    
    }
    
    Calendar updateDays(WheelView year, WheelView month, WheelView day) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR,
                calendar.get(Calendar.YEAR) + (year.getCurrentItem()-NoOfYear));
        calendar.set(Calendar.MONTH, month.getCurrentItem());
    
        int maxDays = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
        day.setViewAdapter(new DateNumericAdapter(Mcontex, 1, maxDays, calendar
                .get(Calendar.DAY_OF_MONTH) - 1));
        int curDay = Math.min(maxDays, day.getCurrentItem() + 1);
        day.setCurrentItem(curDay - 1, true);
        calendar.set(Calendar.DAY_OF_MONTH, curDay);
        return calendar;
    
    }
    
    private class DateNumericAdapter extends NumericWheelAdapter {
        int currentItem;
        int currentValue;
    
        public DateNumericAdapter(Context context, int minValue, int maxValue,
                int current) {
            super(context, minValue, maxValue);
            this.currentValue = current;
            setTextSize(20);
        }
    
        @Override
        protected void configureTextView(TextView view) {
            super.configureTextView(view);
            if (currentItem == currentValue) {
                view.setTextColor(0xFF0000F0);
            }
            view.setTypeface(null, Typeface.BOLD);
        }
    
        @Override
        public View getItem(int index, View cachedView, ViewGroup parent) {
            currentItem = index;
            return super.getItem(index, cachedView, parent);
        }
    }
    
    private class DateArrayAdapter extends ArrayWheelAdapter {
        int currentItem;
        int currentValue;
    
        public DateArrayAdapter(Context context, String[] items, int current) {
            super(context, items);
            this.currentValue = current;
            setTextSize(20);
        }
    
        @Override
        protected void configureTextView(TextView view) {
            super.configureTextView(view);
            if (currentItem == currentValue) {
                view.setTextColor(0xFF0000F0);
            }
            view.setTypeface(null, Typeface.BOLD);
        }
    
        @Override
        public View getItem(int index, View cachedView, ViewGroup parent) {
            currentItem = index;
            return super.getItem(index, cachedView, parent);
        }
    }
    
    public interface DatePickerListner {
        public void OnDoneButton(Dialog datedialog, Calendar c);
    
        public void OnCancelButton(Dialog datedialog);
    }
    
    }
    

    MainActivity.java

    import android.app.Dialog;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle; 
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Locale;
    
    public class MainActivity extends AppCompatActivity {
    
    TextView tvDate;
    Button btShow;
    
    Calendar dateandtime;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        tvDate=(TextView)findViewById(R.id.tvdate);
        btShow=(Button)findViewById(R.id.Save);
        dateandtime = Calendar.getInstance(Locale.US);
    
        btShow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DatePickerDailog dp = new DatePickerDailog(MainActivity.this,
                        dateandtime, new DatePickerDailog.DatePickerListner() {
    
                    @Override
                    public void OnDoneButton(Dialog datedialog, Calendar c) {
                        datedialog.dismiss();
                        dateandtime.set(Calendar.YEAR, c.get(Calendar.YEAR));
                        dateandtime.set(Calendar.MONTH,
                                c.get(Calendar.MONTH));
                        dateandtime.set(Calendar.DAY_OF_MONTH,
                                c.get(Calendar.DAY_OF_MONTH));
                        tvDate.setText(new SimpleDateFormat("dd MMMM yyyy")
                                .format(c.getTime()));
                    }
    
                    @Override
                    public void OnCancelButton(Dialog datedialog) {
                        // TODO Auto-generated method stub
                        datedialog.dismiss();
                    }
                });
                dp.show();
    
    
            }
        });
    
    }
    }
    

    add folder called wheel in com directoty i.e, c:\DatePicker\app\src\main\java\com\wheel\

    In wheel folder NumericWheelAdapter.java i.e, c:\DatePicker\app\src\main\java\com\wheel\NumericWheelAdapter.java

    import android.content.Context;
    
    public class NumericWheelAdapter extends AbstractWheelTextAdapter {
    
    /** The default min value */
    public static final int DEFAULT_MAX_VALUE = 9;
    
    /** The default max value */
    private static final int DEFAULT_MIN_VALUE = 0;
    
    // Values
    private int minValue;
    private int maxValue;
    
    // format
    private String format;
    
    
    public NumericWheelAdapter(Context context) {
        this(context, DEFAULT_MIN_VALUE, DEFAULT_MAX_VALUE);
    }
    
    
    public NumericWheelAdapter(Context context, int minValue, int maxValue) {
        this(context, minValue, maxValue, null);
    }
    
    
    public NumericWheelAdapter(Context context, int minValue, int maxValue, String format) {
        super(context);
    
        this.minValue = minValue;
        this.maxValue = maxValue;
        this.format = format;
    }
    
    @Override
    public CharSequence getItemText(int index) {
        if (index >= 0 && index < getItemsCount()) {
            int value = minValue + index;
            return format != null ? String.format(format, value) : Integer.toString(value);
        }
        return null;
    }
    
    @Override
    public int getItemsCount() {
        return maxValue - minValue + 1;
    }    
    }
    

    create two interface in wheel folder 1. OnWheelClickedListener.java 2. OnWheelChangedListener.java

    OnWheelClickedListener.java

     package com.wheel;
    
    public interface OnWheelClickedListener {
    void onItemClicked(WheelView wheel, int itemIndex);
    }
    

    OnWheelChangedListener.java

     package com.wheel;
    
     public interface OnWheelChangedListener {
     void onChanged(WheelView wheel, int oldValue, int newValue);
     }
    

    output screen like DatePicker

    DatePicker

提交回复
热议问题