2013-09-03 28 views
6

Cách đặt datepicker ở chế độ xem xoay. Đây là hình ảnh, enter image description hereCustom DatePicker trong Android?

Tôi muốn trình chỉnh sửa ngày trông như thế này. Cảm ơn trước.

Trả lời

4

Bạn có thể sử dụng android-wheel widget này để có được kết quả tương tự

4

Tôi đoán đây sẽ giúp bạn

https://github.com/bendemboski/DateSlider

Đây là một chọn ngày tùy chỉnh với các loại bảng chọn ngày khác nhau và các định dạng. Rất dễ dàng để tích hợp trong ứng dụng của bạn cũng

9
@Override 
parentView.findViewById(R.id.changeDate).setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     DialogFragment newFragment = new SelectDateFragmentTrans(); 
     newFragment.show(getFragmentManager(), "DatePicker");  
    } 
}); 

SelectDateFragmentTrans.java:

public class SelectDateFragmentTrans extends DialogFragment 
     implements DatePickerDialog.OnDateSetListener { 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     final Calendar calendar = Calendar.getInstance(); 
     int yy = calendar.get(Calendar.YEAR); 
     int mm = calendar.get(Calendar.MONTH); 
     int dd = calendar.get(Calendar.DAY_OF_MONTH); 
     return new DatePickerDialog(getActivity(), this, yy, mm, dd); 
    } 

    public void onDateSet(DatePicker view, int yy, int mm, int dd) { 
     populateSetDate(yy, mm+1, dd); 
    } 

    public void populateSetDate(int year, int month, int day) { 
     SettingsFragment.date1 = month+"/"+day+"/"+year; 
     TransferFragment.date.setText(month+"/"+day+"/"+year); 
    } 
} 
0

Tôi đã tạo ra một phong tục DatePicker nơi tôi muốn hiển thị Months trong Chuỗi như Jan,Feb,Mar và thứ hai năm là không bắt buộc.

Vì vậy, tôi phải thực hiện từ scratch.

month_year_picker.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:orientation="horizontal"> 

     <NumberPicker 
      android:id="@+id/picker_month" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginEnd="20dp" 
      android:layout_marginRight="20dp"/> 


     <NumberPicker 
      android:id="@+id/picker_day" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginEnd="20dp" 
      android:layout_marginRight="20dp"/> 

     <NumberPicker 
      android:id="@+id/picker_year" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content"/> 

    </LinearLayout> 
</LinearLayout> 

MonthYearPickerDialog.java

public class MonthYearPickerDialog extends DialogFragment { 

    private DatePickerDialog.OnDateSetListener listener; 
    private int daysOfMonth = 31; 

    private NumberPicker monthPicker; 
    private NumberPicker yearPicker; 
    private NumberPicker dayPicker; 

    private Calendar cal = Calendar.getInstance(); 

    public static final String MONTH_KEY = "monthValue"; 
    public static final String DAY_KEY = "dayValue"; 
    public static final String YEAR_KEY = "yearValue"; 

    int monthVal = -1 , dayVal = -1 , yearVal =-1 ; 

    @Override 
    public void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     Bundle extras = getArguments(); 
     if(extras != null){ 
      monthVal = extras.getInt(MONTH_KEY , -1); 
      dayVal = extras.getInt(DAY_KEY , -1); 
      yearVal = extras.getInt(YEAR_KEY , -1); 
     } 
    } 

    public static MonthYearPickerDialog newInstance(int monthIndex , int daysIndex , int yearIndex) { 
     MonthYearPickerDialog f = new MonthYearPickerDialog(); 

     // Supply num input as an argument. 
     Bundle args = new Bundle(); 
     args.putInt(MONTH_KEY, monthIndex); 
     args.putInt(DAY_KEY, daysIndex); 
     args.putInt(YEAR_KEY, yearIndex); 
     f.setArguments(args); 

     return f; 
    } 

    public void setListener(DatePickerDialog.OnDateSetListener listener) { 
     this.listener = listener; 
    } 


    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 

     //getDialog().setTitle("Select your Birthday Date"); 

     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     // Get the layout inflater 
     LayoutInflater inflater = getActivity().getLayoutInflater(); 

     View dialog = inflater.inflate(R.layout.month_year_picker, null); 
     monthPicker = (NumberPicker) dialog.findViewById(R.id.picker_month); 
     yearPicker = (NumberPicker) dialog.findViewById(R.id.picker_year); 
     dayPicker = (NumberPicker) dialog.findViewById(R.id.picker_day); 

     monthPicker.setMinValue(1); 
     monthPicker.setMaxValue(12); 


     if(monthVal != -1)// && (monthVal > 0 && monthVal < 13)) 
      monthPicker.setValue(monthVal); 
     else 
      monthPicker.setValue(cal.get(Calendar.MONTH) + 1); 

     monthPicker.setDisplayedValues(new String[]{"Jan","Feb","Mar","Apr","May","June","July", 
       "Aug","Sep","Oct","Nov","Dec"}); 


     dayPicker.setMinValue(1); 
     dayPicker.setMaxValue(daysOfMonth); 

     if(dayVal != -1) 
      dayPicker.setValue(dayVal); 
     else 
      dayPicker.setValue(cal.get(Calendar.DAY_OF_MONTH)); 

     monthPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() { 
      @Override 
      public void onValueChange(NumberPicker picker, int oldVal, int newVal) { 
       switch (newVal){ 
        case 1:case 3:case 5: 
        case 7:case 8:case 10: 
        case 12: 
         daysOfMonth = 31; 
         dayPicker.setMaxValue(daysOfMonth); 
         break; 
        case 2: 
         daysOfMonth = 28; 
         dayPicker.setMaxValue(daysOfMonth); 
         break; 

        case 4:case 6: 
        case 9:case 11: 
         daysOfMonth = 30; 
         dayPicker.setMaxValue(daysOfMonth); 
         break; 
       } 

      } 
     }); 

     int maxYear = cal.get(Calendar.YEAR);//2016 
     final int minYear = 1997; 
     int arraySize = maxYear - minYear; 

     String[] tempArray = new String[arraySize]; 
     tempArray[0] = "---"; 
     int tempYear = minYear+1; 

     for(int i=0 ; i < arraySize; i++){ 
      if(i != 0){ 
       tempArray[i] = " " + tempYear + ""; 
      } 
      tempYear++; 
     } 
     Log.i("", "onCreateDialog: " + tempArray.length); 
     yearPicker.setMinValue(minYear+1); 
     yearPicker.setMaxValue(maxYear); 
     yearPicker.setDisplayedValues(tempArray); 

     yearPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() { 
      @Override 
      public void onValueChange(NumberPicker picker, int oldVal, int newVal) { 
       try { 
        if(isLeapYear(picker.getValue())){ 
         daysOfMonth = 29; 
         dayPicker.setMaxValue(daysOfMonth); 
        } 
       }catch (Exception e){ 
        e.printStackTrace(); 
       } 
      } 
     }); 

     builder.setView(dialog) 
       // Add action buttons 
       .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int id) { 
         int year = yearPicker.getValue(); 
         if(year == (minYear+1)){ 
          year = 1904; 
         } 
         listener.onDateSet(null, year, monthPicker.getValue(), dayPicker.getValue()); 
        } 
       }) 
       .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int id) { 
         MonthYearPickerDialog.this.getDialog().cancel(); 
        } 
       }); 
     return builder.create(); 
    } 

    public static boolean isLeapYear(int year) { 
     Calendar cal = Calendar.getInstance(); 
     cal.set(Calendar.YEAR, year); 
     return cal.getActualMaximum(Calendar.DAY_OF_YEAR) > 365; 
    } 

    public static boolean isLeapYear2(int year) { 
     if (year % 4 != 0) { 
      return false; 
     } else if (year % 400 == 0) { 
      return true; 
     } else if (year % 100 == 0) { 
      return false; 
     } else { 
      return true; 
     } 
    } 
} 

Và gọi nó như

MonthYearPickerDialog pd = MonthYearPickerDialog.newInstance(5,12, 1999); 
       //new MonthYearPickerDialog(); 

     pd.setListener(new DatePickerDialog.OnDateSetListener() { 
      @Override 
      public void onDateSet(DatePicker view, int selectedYear, int selectedMonth, int selectedDay) { 
       Toast.makeText(getActivity(),"Year : " + selectedYear + " Month :" + selectedMonth + " Day:" + selectedDay, 
         Toast.LENGTH_LONG).show(); 


      } 
     }); 
     pd.show(getFragmentManager(), "MonthYearPickerDialog"); 

Sửa

Tìm một đẹp Example here

1

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<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:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context="com.example.datepickerwithspinner.MainActivity"> 
<TextView 
    android:id="@+id/tvdate" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Hello World!" /> 
<Button 
    android:id="@+id/Save" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_below="@+id/tvdate" 
    android:text="Date Picker"/> 
    </RelativeLayout> 

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<String> { 
    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 thư mục có tên bánh xe trong com directoty ví dụ, c: \ DatePicker \ ứng dụng \ src \ chính \ java \ com \ bánh \

Trong thư mục bánh NumericWheelAdapter.java ví dụ, c: \ DatePicker \ ứng dụng \ src \ chính \ java \ com \ bánh \ 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; 
}  
} 

tạo ra hai giao diện trong thư mục bánh 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); 
} 

màn hình đầu ra như DatePicker

DatePicker