欢迎使用优快云-markdown编辑器

本文介绍了一种仿照支付宝风格的时间选择器实现方案,包括使用Android原生控件DatePicker和自定义WheelView的方式,提供了详细的代码示例及日期选择交互逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

仿支付宝账单时间选择器

项目中需要时间选择器]![仿支付宝(http://www.cocoachina.com/bbs/read.php?tid-1724339.html)


项目中需要仿支付宝的时间选择器的效果,这里有两种方案,一种android原生控件DatePiker,一种自定义wheelView,实现的效果基本一致,原生的更方便简洁一点,一下pull出部分代码

MainActivity

package performance.com.timepiker_test;
import android.app.Activity;
import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.RequiresApi;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CalendarView;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
public class MainActivity extends Activity implements DatePicker.OnDateChangedListener, View.OnClickListener {
private EditText mEditTextstart, mEditTextend;
private LinearLayout mMain;
private ArrayList arry_years = new ArrayList();
private ArrayList arry_months = new ArrayList();
private ArrayList arry_days = new ArrayList();
private int maxTextSize = 24;
private int minTextSize = 14;
private String currentYear = getYear();
private String currentMonth = getMonth();
private String currentDay = getDay();
private boolean issetdata = true;
private String selectYear;
private String selectMonth;
private String selectDay;
private String month;
private String day;
private CalendarTextAdapter mYearAdapter;
private CalendarTextAdapter mMonthAdapter;
private CalendarTextAdapter mDaydapter;
private WheelView wvMonth, wvYear, wvDay;
private String mCurrentTextYear;
private String mCurrentTextMonth;
private String mYear;
private String mMonth;
private String mDay;
private TextView mTips;
private SimpleDateFormat mSdfDate;
private CustomDatePicker mDatePicker;
private long mStringToDate;
private LinearLayout mLinearLayout;
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mStringToDate = getStringToDate(“2014年01月01日”);
Calendar now = Calendar.getInstance();
mEditTextstart = findViewById(R.id.edit1);
mEditTextend = findViewById(R.id.edit2);
Button button1 = findViewById(R.id.button1);
Button button2 = findViewById(R.id.button2);
button1.setOnClickListener(this);
button2.setOnClickListener(this);
mDatePicker = findViewById(R.id.customDatePiker);
mLinearLayout = findViewById(R.id.ll_wheel);
/DatePiker时间轮询器/
mDatePicker.updateDate(2014, 8, 9);
mDatePicker.setDividerColor(0xffcccccc);
//设置最大日期 最小日期
mDatePicker.setMaxDate(now.getTime().getTime());
mDatePicker.setMinDate(mStringToDate);
mDatePicker.getCalendarView().setOnDateChangeListener(new CalendarView.OnDateChangeListener() {
@Override
public void onSelectedDayChange(@NonNull CalendarView calendarView, int i, int i1, int i2) {
Log.e(“TAG”,”打印:”+i+”-“+(i1+1)+”-“+i2);
if(mEditTextstart.isFocused()){
mEditTextstart.setText(i+”-“+(i1+1)+”-“+i2);
}else{
mEditTextend.setText(i+”-“+(i1+1)+”-“+i2);
}
}
});
mSdfDate = new SimpleDateFormat(“yyyy - MM - dd”);
wvYear = findViewById(R.id.wv_birth_year);
wvMonth = findViewById(R.id.wv_birth_month);
wvDay = findViewById(R.id.wv_birth_day);
mTips = findViewById(R.id.tips);
mYear = getYear();
if (Integer.parseInt(getMonth()) < 10) {
mMonth = “0” + getMonth();
} else {
mMonth = getMonth();
}
if (Integer.parseInt(getDay()) < 10) {
mDay = “0” + getDay();
} else {
mDay = getDay();
}
mEditTextstart.setText(getYear() + “-” + mMonth + “-” + mDay);

    if(mEditTextend.isFocused()){
        mEditTextend.setText(mYear+"-"+mMonth+"-"+mDay);
    }

    if (!issetdata) {
        initData();
    }
    initYears();
    mYearAdapter = new CalendarTextAdapter(this, arry_years, setYear(currentYear), maxTextSize, minTextSize);
    wvYear.setVisibleItems(5);
    wvYear.setViewAdapter(mYearAdapter);
    wvYear.setCurrentItem(setYear(currentYear));


    initMonths(Integer.parseInt(month));
    mMonthAdapter = new CalendarTextAdapter(this, arry_months, setMonth(currentMonth), maxTextSize, minTextSize);
    wvMonth.setVisibleItems(5);
    wvMonth.setViewAdapter(mMonthAdapter);
    wvMonth.setCurrentItem(setMonth(currentMonth));

    initDays(Integer.parseInt(day));
    mDaydapter = new CalendarTextAdapter(this, arry_days, Integer.parseInt(currentDay) - 1, maxTextSize, minTextSize);
    wvDay.setVisibleItems(5);
    wvDay.setViewAdapter(mDaydapter);
    wvDay.setCurrentItem(Integer.parseInt(currentDay) - 1);
    Calendar calendar = Calendar.getInstance();
    long timeInMillis = calendar.getTimeInMillis();
    calendar.setTimeInMillis(timeInMillis);


    wvYear.addChangingListener(new OnWheelChangedListener() {

        @Override
        public void onChanged(WheelView wheel, int oldValue, int newValue) {
            // TODO Auto-generated method stub
            String currentText = (String) mYearAdapter.getItemText(wheel.getCurrentItem());
            selectYear = currentText;
            setTextviewSize(currentText, mYearAdapter);
            currentYear = currentText.substring(0, currentText.length() - 1).toString();
            setYear(currentYear);
            initMonths(Integer.parseInt(month));
            mMonthAdapter = new CalendarTextAdapter(getApplicationContext(), arry_months, 0, maxTextSize, minTextSize);
            wvMonth.setVisibleItems(5);
            wvMonth.setViewAdapter((WheelViewAdapter) mMonthAdapter);
            wvMonth.setCurrentItem(0);

            calDays(currentYear, month);
        }
    });

    wvYear.addScrollingListener(new OnWheelScrollListener() {

        @Override
        public void onScrollingStarted(WheelView wheel) {
            // TODO Auto-generated method stub
        }

        @Override
        public void onScrollingFinished(WheelView wheel) {
            // TODO Auto-generated method stub
            mCurrentTextYear = (String) mYearAdapter.getItemText(wheel.getCurrentItem());
            mYear = mCurrentTextYear.substring(0, mCurrentTextYear.length() - 1);
            setTextviewSize(mCurrentTextYear, mYearAdapter);
            if (mEditTextstart.isFocused()) {
                mEditTextstart.setText(mYear + "-01-01");
            } else {
                mEditTextend.setText(mYear + "-01-01");
            }
        }
    });

    wvMonth.addChangingListener(new OnWheelChangedListener() {

        @Override
        public void onChanged(WheelView wheel, int oldValue, int newValue) {
            // TODO Auto-generated method stub
            String currentText = (String) mMonthAdapter.getItemText(wheel.getCurrentItem());
            selectMonth = currentText;
            setTextviewSize(currentText, mMonthAdapter);
            setMonth(currentText.substring(0, 1));
            calDays(currentYear, String.valueOf(wheel.getCurrentItem() + 1));
            initDays(Integer.parseInt(day));
            mDaydapter = new CalendarTextAdapter(getApplicationContext(), arry_days, 0, maxTextSize, minTextSize);
            wvDay.setVisibleItems(5);
            wvDay.setViewAdapter(mDaydapter);
            wvDay.setCurrentItem(0);

        }
    });

    wvMonth.addScrollingListener(new OnWheelScrollListener() {

        @Override
        public void onScrollingStarted(WheelView wheel) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onScrollingFinished(WheelView wheel) {
            // TODO Auto-generated method stub
            mCurrentTextMonth = (String) mMonthAdapter.getItemText(wheel.getCurrentItem());
            mMonth = mCurrentTextMonth.substring(0, mCurrentTextMonth.length() - 1);
            if (Integer.parseInt(mMonth) < 10) {
                mMonth = "0" + mMonth;
            }
            setTextviewSize(mCurrentTextMonth, mMonthAdapter);
            if (!mDay.equals("01")) {
                mDay = "01";
            }
            if (mEditTextstart.isFocused()) {
                if (mYear != null) {
                    mEditTextstart.setText(mYear + "-" + mMonth + "-" + mDay);
                } else {
                    mEditTextstart.setText(getYear() + "-" + mMonth + "-" + mDay);
                }
            } else {
                if (mYear != null) {
                    mEditTextend.setText(mYear + "-" + mMonth + "-" + mDay);
                } else {
                    mEditTextend.setText(getYear() + "-" + mMonth + "-" + getDay());
                }
            }
            if (mEditTextstart.getText().toString() != "" && mEditTextend.getText().toString() != "") {
                String start = mEditTextstart.getText().toString();
                String finish = mEditTextend.getText().toString();

// SimpleDateFormat dfs = new SimpleDateFormat(“yyyy-MM-dd”);
try {
SimpleDateFormat dfs = new SimpleDateFormat(“yyyy-MM-dd”);
Date begin = null;
Date end = null;

                    begin = dfs.parse(start);
                    end = dfs.parse(finish);
                    long l = begin.getTime() - end.getTime();
                    long day = l / (24 * 60 * 60 * 1000);
                    Log.e("TAG", "打印:" + day);
                    if (day > 180) {
                        mTips.setVisibility(View.VISIBLE);
                    } else {
                        mTips.setVisibility(View.GONE);
                    }
                } catch (ParseException e) {
                    Log.e("TAG", "打印try:" + e.toString());
                }
            }
        }
    });

    wvDay.addChangingListener(new OnWheelChangedListener() {

        @Override
        public void onChanged(WheelView wheel, int oldValue, int newValue) {
            // TODO Auto-generated method stub
            String currentText = (String) mDaydapter.getItemText(wheel.getCurrentItem());
            setTextviewSize(currentText, mDaydapter);
            selectDay = currentText;
        }
    });

    wvDay.addScrollingListener(new OnWheelScrollListener() {

        @Override
        public void onScrollingStarted(WheelView wheel) {
            // TODO Auto-generated method stub
        }

        @Override
        public void onScrollingFinished(WheelView wheel) {
            // TODO Auto-generated method stub
            String currentTextDay = (String) mDaydapter.getItemText(wheel.getCurrentItem());
            mDay = currentTextDay.substring(0, currentTextDay.length() - 1);
            if (Integer.parseInt(mDay) < 10) {
                mDay = "0" + mDay;
            }

// if(!mMonth.equals(“01”)){
// mMonth=”01”;
// }
setTextviewSize(currentTextDay, mDaydapter);
if (mEditTextstart.isFocused()) {
mEditTextstart.setText(mYear + “-” + mMonth + “-” + mDay);
} else {
mEditTextend.setText(mYear + “-” + mMonth + “-” + mDay);
}
if (mEditTextstart.getText().toString() != “” && mEditTextend.getText().toString() != “”) {
String start = mEditTextstart.getText().toString();
String finish = mEditTextend.getText().toString();
// SimpleDateFormat dfs = new SimpleDateFormat(“yyyy-MM-dd”);
try {
SimpleDateFormat dfs = new SimpleDateFormat(“yyyy-MM-dd”);
Date begin = null;
Date end = null;

                    begin = dfs.parse(start);
                    end = dfs.parse(finish);
                    long l = begin.getTime() - end.getTime();
                    long day = l / (24 * 60 * 60 * 1000);
                    Log.e("TAG", "打印:" + day);
                    if (day > 180) {
                        mTips.setVisibility(View.VISIBLE);
                    } else {
                        mTips.setVisibility(View.GONE);
                    }
                } catch (ParseException e) {
                    Log.e("TAG", "打印try:" + e.toString());
                }
            }
        }
    });
}

/**
 * 设置字体大小
 *
 * @param curriteItemText
 * @param adapter
 */
public void setTextviewSize(String curriteItemText, CalendarTextAdapter adapter) {
    ArrayList<View> arrayList = adapter.getTestViews();
    int size = arrayList.size();
    String currentText;
    for (int i = 0; i < size; i++) {
        TextView textvew = (TextView) arrayList.get(i);
        currentText = textvew.getText().toString();
        if (curriteItemText.equals(currentText)) {
            textvew.setTextSize(maxTextSize);
        } else {
            textvew.setTextSize(minTextSize);
        }
    }
}

public String getYear() {
    Calendar c = Calendar.getInstance();
    return c.get(Calendar.YEAR) + "";
}

public String getMonth() {
    Calendar c = Calendar.getInstance();
    return c.get(Calendar.MONTH) + 1 + "";
}

public String getDay() {
    Calendar c = Calendar.getInstance();
    return c.get(Calendar.DATE) + "";
}

public void initData() {
    setDate(getYear(), getMonth(), getDay());
    this.currentDay = 1 + "";
    this.currentMonth = 1 + "";
}

/**
 * 设置年份
 *
 * @param year
 */
public int setYear(String year) {
    int yearIndex = 0;
    if (!year.equals(getYear())) {
        this.month = 12 + "";
    } else {
        this.month = getMonth();
    }
    for (int i = Integer.parseInt(getYear()); i >= 2014; i--) {
        yearIndex++;
    }
    return yearIndex;
}

/**
 * 设置年月日
 *
 * @param year
 * @param month
 * @param day
 */
public void setDate(String year, String month, String day) {
    selectYear = year + "年";
    selectMonth = month + "月";
    selectDay = day + "日";
    issetdata = true;
    this.currentYear = year;
    this.currentMonth = month;
    this.currentDay = day;
    if (year == getYear()) {
        this.month = getMonth();
    } else {
        this.month = 12 + "";
    }
    calDays(year, month);
}

/**
 * 设置月份
 *
 * @param month
 * @param month
 * @return
 */
public int setMonth(String month) {
    int monthIndex = 0;
    calDays(currentYear, month);
    for (int i = 1; i < Integer.parseInt(this.month); i++) {
        if (Integer.parseInt(month) == i) {
            return monthIndex;
        } else {
            monthIndex++;
        }
    }
    return monthIndex;
}

public void initYears() {
    for (int i = 2013; i <= Integer.parseInt(getYear()); i++) {
        arry_years.add(i + "年");
    }
}

public void initMonths(int months) {
    arry_months.clear();
    for (int i = 1; i <= months; i++) {
        arry_months.add(i + "月");
    }
}

public void initDays(int days) {
    arry_days.clear();
    for (int i = 1; i <= days; i++) {
        arry_days.add(i + "日");
    }

}

/**
 * 计算每月多少天
 *
 * @param month
 * @param year
 */
public void calDays(String year, String month) {
    boolean leayyear = false;
    if (Integer.parseInt(year) % 4 == 0 && Integer.parseInt(year) % 100 != 0) {
        leayyear = true;
    } else {
        leayyear = false;
    }
    for (int i = 1; i <= 12; i++) {
        switch (Integer.parseInt(month)) {
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                this.day = 31 + "";
                break;
            case 2:
                if (leayyear) {
                    this.day = 29 + "";
                } else {
                    this.day = 28 + "";
                }
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                this.day = 30 + "";
                break;
        }
    }
    if (year.equals(getYear()) && month.equals(getMonth())) {
        this.day = getDay();
    }
}
/*将字符串转为时间戳*/
public static long getStringToDate(String time) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
    Date date = new Date();
    try{
        date = sdf.parse(time);
    } catch(ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return date.getTime();
}

@Override
public void onDateChanged(DatePicker datePicker, int i, int i1, int i2) {
    Log.e("TAG","点击了");
}

@Override
public void onClick(View view) {
    switch (view.getId()){
        case R.id.button1:
            mDatePicker.setVisibility(View.VISIBLE);
            mLinearLayout.setVisibility(View.GONE);
            break;
        case R.id.button2:
            mLinearLayout.setVisibility(View.VISIBLE);
            mDatePicker.setVisibility(View.GONE);
            break;
    }
}


private class CalendarTextAdapter extends performance.com.timepiker_test.AbstractWheelTextAdapter1 {
    ArrayList<String> list;

    protected CalendarTextAdapter(Context context, ArrayList<String> list, int currentItem, int maxsize, int minsize) {
        super(context, R.layout.item_birth_year, NO_RESOURCE, currentItem, maxsize, minsize);
        this.list = list;
        setItemTextResource(R.id.tempValue);
    }

    @Override
    public View getItem(int index, View cachedView, ViewGroup parent) {
        View view = super.getItem(index, cachedView, parent);
        return view;
    }

    @Override
    public int getItemsCount() {
        return list.size();
    }

    @Override
    protected CharSequence getItemText(int index) {
        return list.get(index) + "";
    }
}

}

自定义Datepiker_CustomDatePicker

package performance.com.timepiker_test;
import android.content.Context;
import android.graphics.drawable.ColorDrawable;
import android.os.Build;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.widget.DatePicker;
import android.widget.LinearLayout;
import android.widget.NumberPicker;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
public class CustomDatePicker extends DatePicker
{
private List mPickers;
public CustomDatePicker(Context context)
{
super(context);
findNumberPicker();
}
public CustomDatePicker(Context context, AttributeSet attrs)
{
super(context, attrs);
findNumberPicker();
}
public CustomDatePicker(Context context, AttributeSet attrs, int defStyleAttr)
{
super(context, attrs, defStyleAttr);
findNumberPicker();
}
/**
* 得到控件里面的numberpicker组件
*/
private void findNumberPicker()
{
mPickers = new ArrayList();
LinearLayout llFirst = (LinearLayout) getChildAt(0);
LinearLayout mSpinners = (LinearLayout) llFirst.getChildAt(0);
for (int i = 0; i < mSpinners.getChildCount(); i++)
{
NumberPicker picker = (NumberPicker) mSpinners.getChildAt(i);
mPickers.add(i, picker);
}
}
/**
* 设置时间
* @param strDate yyyy-mm-dd
*/
public void setDate(String strDate)
{
int day, month, year;
if (!TextUtils.isEmpty(strDate))
{
String[] dateValues = strDate.split(“-“);
if (dateValues.length == 3)
{
year = Integer.parseInt(dateValues[0]);
month = Integer.parseInt(dateValues[1]) - 1;
day = Integer.parseInt(dateValues[2]);
updateDate(year, month, day);
return;
}
}
//error
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
day = calendar.get(Calendar.DAY_OF_MONTH);
month = calendar.get(Calendar.MONTH);
year = calendar.get(Calendar.YEAR);
updateDate(year, month, day);
}
/**
* 获得时间
* @return yyyy-mm-dd
*/
public String getDate()
{
StringBuilder sbDate = new StringBuilder();
sbDate.append(format2Digits(getYear())).append(“-“)
.append(format2Digits(getMonth()+1)).append(“-“)
.append(format2Digits(getDayOfMonth()));
return sbDate.toString();
}
private String format2Digits(int value)
{
return String.format(“%02d”,value);
}
/**
* 设置picker间隔
*
* @param margin
*/
public void setPickerMargin(int margin)
{
for (NumberPicker picker : mPickers)
{
LinearLayout.LayoutParams lps = (LinearLayout.LayoutParams) picker.getLayoutParams();
lps.setMargins(margin, 0, margin, 0);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
{
lps.setMarginStart(margin);
lps.setMarginEnd(margin);
}
picker.setLayoutParams(lps);
}
}
/**
* 设置时间选择器的分割线颜色
*/
public void setDividerColor(int color)
{
for (int i = 0; i < mPickers.size(); i++)
{
NumberPicker picker = mPickers.get(i);

        try
        {
            Field pf = NumberPicker.class.getDeclaredField("mSelectionDivider");
            pf.setAccessible(true);
            pf.set(picker, new ColorDrawable(color));
        }
        catch (NoSuchFieldException e)
        {
            e.printStackTrace();
        }
        catch (IllegalAccessException e)
        {
            e.printStackTrace();
        }
    }
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值