package com.partynetwork.iparty.iparty; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.List; import com.partynetwork.dataprovider.util.DisplayUtil; import com.partynetwork.dataprovider.util.StringUtil; import com.partynetwork.iparty.R; import com.partynetwork.iparty.dom.OnTimeTypeListener; import com.partynetwork.iparty.info.TimeInfo; import com.partynetwork.myui.CommonView; import com.partynetwork.myview.wheelview.NumericWheelAdapter; import com.partynetwork.myview.wheelview.OnWheelChangedListener; import com.partynetwork.myview.wheelview.WheelPicker; import com.partynetwork.myview.wheelview.WheelView; import android.app.Activity; import android.graphics.Color; import android.graphics.drawable.BitmapDrawable; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.animation.AnimationUtils; import android.widget.Button; import android.widget.LinearLayout; import android.widget.PopupWindow; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.LinearLayout.LayoutParams; /** * 具体时间操作页面 * * @author 沈跃双 Create at 2013-12-25 下午8:29:11 */ public class IpartyPublishTimeSite extends CommonView implements OnClickListener { /** * 年份范围结束 */ private static final int END_YEAR = 2100; /** * 每一项控件的高度 */ private int itemHeight; /** * 时间的填充区域 */ private LinearLayout body; /** * 显示当前选中时间的文本 */ private TextView dateTv; /** * 类别文本 */ private TextView typeTv; /** * 日期选取控件 */ private PopupWindow datePopupWindow; private WheelView wvYear; private WheelView wvMonth; private WheelView wvDay; /** * 时间的频率 */ private int[] week; private List<TextView> dateTvList = new ArrayList<TextView>(); private OnTimeTypeListener listener; /** * 时间的类别 */ private int timeType; /** * * 构造函数 * * @param mActivity * @param listener */ public IpartyPublishTimeSite(Activity mActivity, OnTimeTypeListener listener) { this.mActivity = mActivity; this.listener = listener; mView = LayoutInflater.from(mActivity).inflate( R.layout.iparty_publish_time_site, null); init(); } /** * 初始化数据、控件 */ private void init() { initView(); itemHeight = DisplayUtil.dip2px(this.mActivity, 60); initTime(1); } /** * 初始化方法 */ private void initView() { /** * 时间的填充区域 */ body = (LinearLayout) mView.findViewById(R.id.time_body_ll); /** * 显示当前选中时间的文本 */ dateTv = (TextView) mView.findViewById(R.id.time_date_tv); /** * 类别文本 */ typeTv = (TextView) mView.findViewById(R.id.iparty_publish_type_tv); mView.findViewById(R.id.iparty_publish_type).setOnClickListener(this); } /** * * @param position */ public void initTime(int position) { clearBody(); switch (position) { case 1: timeType = 0; typeTv.setText("当天结束"); addDateView("日期", 0); addDateView("开始时间", 1); addDateView("结束时间", 1); break; case 2: timeType = 1; typeTv.setText("连续多天"); addDateView("开始日期", 0); addDateView("结束日期", 0); addDateView("开始时间", 1); addDateView("结束时间", 1); break; case 3: timeType = 2; typeTv.setText("每周举行"); addDateView("频率", 2); addDateView("开始日期", 0); addDateView("结束日期", 0); addDateView("开始时间", 1); addDateView("结束时间", 1); break; default: break; } } public void onClick(View view) { switch (view.getId()) { case R.id.iparty_publish_type: listener.change(4); break; default: break; } } /** * 清空时间显示范围的内容布局 */ private void clearBody() { body.removeAllViews(); dateTvList.removeAll(dateTvList); dateTv.setText(""); } /** * 打印日期 */ private void printDate() { String str = ""; for (TextView tv : dateTvList) { str += tv.getText().toString() + " "; } dateTv.setText(str); } /** * 获取当前选择的时间文本 * * @return */ public TimeInfo[] getDate() { TimeInfo[] timeInfo = null; if (timeType == 0) { timeInfo = new TimeInfo[1]; timeInfo[0] = new TimeInfo(); timeInfo[0].setStartTime(StringUtil.getTime(dateTvList.get(0) .getText().toString() + dateTvList.get(1).getText().toString())); timeInfo[0].setEndTime(StringUtil.getTime(dateTvList.get(0) .getText().toString() + dateTvList.get(2).getText().toString())); } else if (timeType == 1) { timeInfo = new TimeInfo[1]; timeInfo[0] = new TimeInfo(); timeInfo[0].setStartTime(StringUtil.getTime(dateTvList.get(0) .getText().toString() + dateTvList.get(2).getText().toString())); timeInfo[0].setEndTime(StringUtil.getTime(dateTvList.get(1) .getText().toString() + dateTvList.get(3).getText().toString())); } else if (timeType == 2) { timeInfo = new TimeInfo[1]; timeInfo[0] = new TimeInfo(); timeInfo[0].setStartTime(StringUtil.getTime(dateTvList.get(1) .getText().toString() + dateTvList.get(3).getText().toString())); timeInfo[0].setEndTime(StringUtil.getTime(dateTvList.get(2) .getText().toString() + dateTvList.get(4).getText().toString())); timeInfo[0].setWeek(week); } return timeInfo; } /** * 添加日期布局 * * @param title * 左侧显示的标题 * @param type * 0:选择日期;1:选择时间 ;2:选择星期 */ private void addDateView(String title, final int type) { RelativeLayout layout = new RelativeLayout(this.mActivity); LayoutParams param = new LayoutParams(LayoutParams.FILL_PARENT, itemHeight); layout.setLayoutParams(param); layout.setBackgroundColor(Color.WHITE); TextView tv = new TextView(this.mActivity); RelativeLayout.LayoutParams paramTv = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.FILL_PARENT); paramTv.setMargins(DisplayUtil.dip2px(this.mActivity, 20), 0, 0, 0); tv.setGravity(Gravity.CENTER_VERTICAL); tv.setText(title); tv.setTextColor(Color.parseColor("#5A5858")); tv.setTextSize(15); layout.addView(tv, paramTv); TextView tv2 = new TextView(this.mActivity); RelativeLayout.LayoutParams paramTv2 = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.FILL_PARENT); paramTv2.setMargins(0, 0, DisplayUtil.dip2px(this.mActivity, 20), 0); paramTv2.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE); tv2.setGravity(Gravity.CENTER_VERTICAL); tv2.setTextColor(Color.parseColor("#5A5858")); tv2.setTextSize(15); layout.addView(tv2, paramTv2); // 用于区分操作区域的tag layout.setTag(dateTvList.size()); // 放进显示列表用于之后选择显示 dateTvList.add(tv2); // 设置监听 layout.setOnClickListener(new OnClickListener() { public void onClick(View v) { if (type == 2) { listener.change(5); } else { showPopDate(type, Integer.parseInt(v.getTag().toString())); } } }); addLine(); body.addView(layout); } /** * 添加分割线 */ private void addLine() { LinearLayout layout = new LinearLayout(this.mActivity); LayoutParams param = new LayoutParams(LayoutParams.FILL_PARENT, 1); layout.setLayoutParams(param); layout.setBackgroundColor(this.mActivity.getResources().getColor( R.color.lightgray)); body.addView(layout); } /** * 显示弹出的时间选择控件 * * @param type * 0:选择日期;1:选择时间 */ private void showPopDate(final int type, final int position) { Calendar calendar = Calendar.getInstance(); final int year = calendar.get(Calendar.YEAR); int month = calendar.get(Calendar.MONTH); int day = calendar.get(Calendar.DATE); int hour = calendar.get(Calendar.HOUR); int minute = calendar.get(Calendar.MINUTE); View view = View .inflate(this.mActivity, R.layout.wheelview_three, null); // 弹出框的功能按钮 Button leftBtn = (Button) view.findViewById(R.id.left_btn); Button rightBtn = (Button) view.findViewById(R.id.right_btn); leftBtn.setVisibility(View.GONE); // 事件监听 rightBtn.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { String yearS = wvYear.getTextItem(wvYear.getCurrentItem()); String monthS = wvMonth.getTextItem(wvMonth.getCurrentItem()); String dayS = wvDay.getTextItem(wvDay.getCurrentItem()); if (type == 1) { dateTvList.get(position) .setText(yearS + "时" + monthS + "分"); } else { dateTvList.get(position).setText( yearS + "年" + monthS + "月" + dayS + "日"); } if (datePopupWindow.isShowing()) { datePopupWindow.dismiss(); } printDate(); } }); wvYear = (WheelView) view.findViewById(R.id.first_wheel); wvMonth = (WheelView) view.findViewById(R.id.second_wheel); wvDay = (WheelView) view.findViewById(R.id.third_wheel); if (type == 1) { wvYear.setAdapter(new NumericWheelAdapter(0, 23)); wvYear.setCyclic(true);// 可循环滚动 wvYear.setCurrentItem(hour - 0);// 初始化时显示的数据 wvMonth.setAdapter(new NumericWheelAdapter(0, 59)); wvMonth.setCyclic(true);// 可循环滚动 wvMonth.setCurrentItem(minute - 0);// 初始化时显示的数据 wvDay.setVisibility(View.GONE); } else { // 添加大小月月份并将其转换为list,方便之后的判断 String[] months_big = { "1", "3", "5", "7", "8", "10", "12" }; String[] months_little = { "4", "6", "9", "11" }; final List<String> list_big = Arrays.asList(months_big); final List<String> list_little = Arrays.asList(months_little); // 年 wvYear.setAdapter(new NumericWheelAdapter(year, END_YEAR));// 设置"年"的显示数据 wvYear.setCyclic(true);// 可循环滚动 wvYear.setLabel("年");// 添加文字 wvYear.setCurrentItem(0);// 初始化时显示的数据 // 月 wvMonth.setAdapter(new NumericWheelAdapter(1, 12)); wvMonth.setCyclic(true); wvMonth.setLabel("月"); wvMonth.setCurrentItem(month); // 日 wvDay.setCyclic(true); // 判断大小月及是否闰年,用来确定"日"的数据 if (list_big.contains(String.valueOf(month + 1))) { wvDay.setAdapter(new NumericWheelAdapter(1, 31)); } else if (list_little.contains(String.valueOf(month + 1))) { wvDay.setAdapter(new NumericWheelAdapter(1, 30)); } else { // 闰年 if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) wvDay.setAdapter(new NumericWheelAdapter(1, 29)); else wvDay.setAdapter(new NumericWheelAdapter(1, 28)); } wvDay.setLabel("日"); wvDay.setCurrentItem(day - 1); // 添加"年"监听 OnWheelChangedListener wheelListener_year = new OnWheelChangedListener() { public void onChanged(WheelView wheel, int oldValue, int newValue) { int year_num = newValue + year; // 判断大小月及是否闰年,用来确定"日"的数据 if (list_big.contains(String.valueOf(wvMonth .getCurrentItem() + 1))) { wvDay.setAdapter(new NumericWheelAdapter(1, 31)); } else if (list_little.contains(String.valueOf(wvMonth .getCurrentItem() + 1))) { wvDay.setAdapter(new NumericWheelAdapter(1, 30)); } else { if ((year_num % 4 == 0 && year_num % 100 != 0) || year_num % 400 == 0) wvDay.setAdapter(new NumericWheelAdapter(1, 29)); else wvDay.setAdapter(new NumericWheelAdapter(1, 28)); } } }; // 添加"月"监听 OnWheelChangedListener wheelListener_month = new OnWheelChangedListener() { public void onChanged(WheelView wheel, int oldValue, int newValue) { int month_num = newValue + 1; // 判断大小月及是否闰年,用来确定"日"的数据 if (list_big.contains(String.valueOf(month_num))) { wvDay.setAdapter(new NumericWheelAdapter(1, 31)); } else if (list_little.contains(String.valueOf(month_num))) { wvDay.setAdapter(new NumericWheelAdapter(1, 30)); } else { if (((wvYear.getCurrentItem() + year) % 4 == 0 && (wvYear .getCurrentItem() + year) % 100 != 0) || (wvYear.getCurrentItem() + year) % 400 == 0) wvDay.setAdapter(new NumericWheelAdapter(1, 29)); else wvDay.setAdapter(new NumericWheelAdapter(1, 28)); } } }; wvYear.addChangingListener(wheelListener_year); wvMonth.addChangingListener(wheelListener_month); } view.startAnimation(AnimationUtils.loadAnimation(this.mActivity, R.anim.push_bottom_in)); if (datePopupWindow == null) { datePopupWindow = new PopupWindow(this.mActivity); datePopupWindow.setWidth(LayoutParams.WRAP_CONTENT); datePopupWindow.setHeight(LayoutParams.WRAP_CONTENT); datePopupWindow.setBackgroundDrawable(new BitmapDrawable()); datePopupWindow.setFocusable(true); datePopupWindow.setOutsideTouchable(true); } datePopupWindow.setContentView(view); datePopupWindow.showAtLocation(body, Gravity.BOTTOM, 0, 0); datePopupWindow.update(); } /** * 把list的星期显示到文本上去 * * @param list */ public void setRate(List<Integer> list) { String str = ""; week = new int[list.size()]; for (int i = 0; i < list.size(); i++) { week[i] = list.get(i); str += " " + (list.get(i) + 1); } dateTvList.get(0).setText("每周" + str); } }