package com.bigkoo.pickerview; import android.content.Context; import android.graphics.Typeface; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import com.bigkoo.pickerview.lib.WheelView; import com.bigkoo.pickerview.listener.CustomListener; import com.bigkoo.pickerview.view.BasePickerView; import com.bigkoo.pickerview.view.WheelOptions; import java.util.List; /** * 条件选择器 * Created by Sai on 15/11/22. */ public class OptionsPickerView<T> extends BasePickerView implements View.OnClickListener { WheelOptions<T> wheelOptions; private int layoutRes; private CustomListener customListener; private Button btnSubmit, btnCancel; //确定、取消按钮 private TextView tvTitle; private RelativeLayout rv_top_bar; private static final String TAG_SUBMIT = "submit"; private static final String TAG_CANCEL = "cancel"; private OnOptionsSelectListener optionsSelectListener; private String Str_Submit;//确定按钮文字 private String Str_Cancel;//取消按钮文字 private String Str_Title;//标题文字 private int Color_Submit;//确定按钮颜色 private int Color_Cancel;//取消按钮颜色 private int Color_Title;//标题颜色 private int Color_Background_Wheel;//滚轮背景颜色 private int Color_Background_Title;//标题背景颜色 private int Size_Submit_Cancel;//确定取消按钮大小 private int Size_Title;//标题文字大小 private int Size_Content;//内容文字大小 private int textColorOut; //分割线以外的文字颜色 private int textColorCenter; //分割线之间的文字颜色 private int dividerColor; //分割线的颜色 private int backgroundId; //显示时的外部背景色颜色,默认是灰色 // 条目间距倍数 默认1.6 private float lineSpacingMultiplier = 1.6F; private boolean isDialog;//是否是对话框模式 private boolean cancelable;//是否能取消 private boolean linkage;//是否联动 private boolean isCenterLabel ;//是否只显示中间的label private String label1;//单位 private String label2; private String label3; private boolean cyclic1;//是否循环 private boolean cyclic2; private boolean cyclic3; private Typeface font;//字体样式 private int option1;//默认选中项 private int option2; private int option3; private WheelView.DividerType dividerType;//分隔线类型 //构造方法 public OptionsPickerView(Builder builder) { super(builder.context); this.optionsSelectListener = builder.optionsSelectListener; this.Str_Submit = builder.Str_Submit; this.Str_Cancel = builder.Str_Cancel; this.Str_Title = builder.Str_Title; this.Color_Submit = builder.Color_Submit; this.Color_Cancel = builder.Color_Cancel; this.Color_Title = builder.Color_Title; this.Color_Background_Wheel = builder.Color_Background_Wheel; this.Color_Background_Title = builder.Color_Background_Title; this.Size_Submit_Cancel = builder.Size_Submit_Cancel; this.Size_Title = builder.Size_Title; this.Size_Content = builder.Size_Content; this.cyclic1 = builder.cyclic1; this.cyclic2 = builder.cyclic2; this.cyclic3 = builder.cyclic3; this.cancelable = builder.cancelable; this.linkage = builder.linkage; this.isCenterLabel = builder.isCenterLabel; this.label1 = builder.label1; this.label2 = builder.label2; this.label3 = builder.label3; this.font = builder.font; this.option1 = builder.option1; this.option2 = builder.option2; this.option3 = builder.option3; this.textColorCenter = builder.textColorCenter; this.textColorOut = builder.textColorOut; this.dividerColor = builder.dividerColor; this.lineSpacingMultiplier = builder.lineSpacingMultiplier; this.customListener = builder.customListener; this.layoutRes = builder.layoutRes; this.isDialog = builder.isDialog; this.dividerType = builder.dividerType; this.backgroundId = builder.backgroundId; this.decorView = builder.decorView; initView(builder.context); } //建造器 public static class Builder { private int layoutRes = R.layout.pickerview_options; private CustomListener customListener; private Context context; private OnOptionsSelectListener optionsSelectListener; private String Str_Submit;//确定按钮文字 private String Str_Cancel;//取消按钮文字 private String Str_Title;//标题文字 private int Color_Submit;//确定按钮颜色 private int Color_Cancel;//取消按钮颜色 private int Color_Title;//标题颜色 private int Color_Background_Wheel;//滚轮背景颜色 private int Color_Background_Title;//标题背景颜色 private int Size_Submit_Cancel = 17;//确定取消按钮大小 private int Size_Title = 18;//标题文字大小 private int Size_Content = 18;//内容文字大小 private boolean cancelable = true;//是否能取消 private boolean linkage = true;//是否联动 private boolean isCenterLabel = true;//是否只显示中间的label private int textColorOut; //分割线以外的文字颜色 private int textColorCenter; //分割线之间的文字颜色 private int dividerColor; //分割线的颜色 private int backgroundId; //显示时的外部背景色颜色,默认是灰色 public ViewGroup decorView ;//显示pickerview的根View,默认是activity的根view // 条目间距倍数 默认1.6 private float lineSpacingMultiplier = 1.6F; private boolean isDialog;//是否是对话框模式 private String label1; private String label2; private String label3; private boolean cyclic1 = false;//是否循环,默认否 private boolean cyclic2 = false; private boolean cyclic3 = false; private Typeface font; private int option1;//默认选中项 private int option2; private int option3; private WheelView.DividerType dividerType;//分隔线类型 //Required public Builder(Context context, OnOptionsSelectListener listener) { this.context = context; this.optionsSelectListener = listener; } //Option public Builder setSubmitText(String Str_Cancel) { this.Str_Submit = Str_Cancel; return this; } public Builder setCancelText(String Str_Cancel) { this.Str_Cancel = Str_Cancel; return this; } public Builder setTitleText(String Str_Title) { this.Str_Title = Str_Title; return this; } public Builder isDialog(boolean isDialog) { this.isDialog = isDialog; return this; } public Builder setSubmitColor(int Color_Submit) { this.Color_Submit = Color_Submit; return this; } public Builder setCancelColor(int Color_Cancel) { this.Color_Cancel = Color_Cancel; return this; } /** * 显示时的外部背景色颜色,默认是灰色 * @param backgroundId * @return */ public Builder setBackgroundId(int backgroundId) { this.backgroundId = backgroundId; return this; } /** * 必须是viewgroup * 设置要将pickerview显示到的容器 * @param decorView * @return */ public Builder setDecorView(ViewGroup decorView) { this.decorView = decorView; return this; } public Builder setLayoutRes(int res, CustomListener listener) { this.layoutRes = res; this.customListener = listener; return this; } public Builder setBgColor(int Color_Background_Wheel) { this.Color_Background_Wheel = Color_Background_Wheel; return this; } public Builder setTitleBgColor(int Color_Background_Title) { this.Color_Background_Title = Color_Background_Title; return this; } public Builder setTitleColor(int Color_Title) { this.Color_Title = Color_Title; return this; } public Builder setSubCalSize(int Size_Submit_Cancel) { this.Size_Submit_Cancel = Size_Submit_Cancel; return this; } public Builder setTitleSize(int Size_Title) { this.Size_Title = Size_Title; return this; } public Builder setContentTextSize(int Size_Content) { this.Size_Content = Size_Content; return this; } public Builder setOutSideCancelable(boolean cancelable) { this.cancelable = cancelable; return this; } /** * 此方法已废弃 * 不联动的情况下,请调用 setNPicker 方法。 * */ @Deprecated public Builder setLinkage(boolean linkage) { this.linkage = linkage; return this; } public Builder setLabels(String label1, String label2, String label3) { this.label1 = label1; this.label2 = label2; this.label3 = label3; return this; } /** * 设置间距倍数,但是只能在1.2-2.0f之间 * * @param lineSpacingMultiplier */ public Builder setLineSpacingMultiplier(float lineSpacingMultiplier) { this.lineSpacingMultiplier = lineSpacingMultiplier; return this; } /** * 设置分割线的颜色 * * @param dividerColor */ public Builder setDividerColor(int dividerColor) { this.dividerColor = dividerColor; return this; } /** * 设置分割线的类型 * * @param dividerType */ public Builder setDividerType(WheelView.DividerType dividerType) { this.dividerType = dividerType; return this; } /** * 设置分割线之间的文字的颜色 * * @param textColorCenter */ public Builder setTextColorCenter(int textColorCenter) { this.textColorCenter = textColorCenter; return this; } /** * 设置分割线以外文字的颜色 * * @param textColorOut */ public Builder setTextColorOut(int textColorOut) { this.textColorOut = textColorOut; return this; } public Builder setTypeface(Typeface font) { this.font = font; return this; } public Builder setCyclic(boolean cyclic1, boolean cyclic2, boolean cyclic3) { this.cyclic1 = cyclic1; this.cyclic2 = cyclic2; this.cyclic3 = cyclic3; return this; } public Builder setSelectOptions(int option1) { this.option1 = option1; return this; } public Builder setSelectOptions(int option1, int option2) { this.option1 = option1; this.option2 = option2; return this; } public Builder setSelectOptions(int option1, int option2, int option3) { this.option1 = option1; this.option2 = option2; this.option3 = option3; return this; } public Builder isCenterLabel(boolean isCenterLabel) { this.isCenterLabel = isCenterLabel; return this; } public OptionsPickerView build() { return new OptionsPickerView(this); } } private void initView(Context context) { setDialogOutSideCancelable(cancelable); initViews(backgroundId); init(); initEvents(); if (customListener == null) { LayoutInflater.from(context).inflate(layoutRes, contentContainer); //顶部标题 tvTitle = (TextView) findViewById(R.id.tvTitle); rv_top_bar = (RelativeLayout)findViewById(R.id.rv_topbar); //确定和取消按钮 btnSubmit = (Button) findViewById(R.id.btnSubmit); btnCancel = (Button) findViewById(R.id.btnCancel); btnSubmit.setTag(TAG_SUBMIT); btnCancel.setTag(TAG_CANCEL); btnSubmit.setOnClickListener(this); btnCancel.setOnClickListener(this); //设置文字 btnSubmit.setText(TextUtils.isEmpty(Str_Submit) ? context.getResources().getString(R.string.pickerview_submit) : Str_Submit); btnCancel.setText(TextUtils.isEmpty(Str_Cancel) ? context.getResources().getString(R.string.pickerview_cancel) : Str_Cancel); tvTitle.setText(TextUtils.isEmpty(Str_Title) ? "" : Str_Title);//默认为空 //设置color btnSubmit.setTextColor(Color_Submit == 0 ? pickerview_timebtn_nor : Color_Submit); btnCancel.setTextColor(Color_Cancel == 0 ? pickerview_timebtn_nor : Color_Cancel); tvTitle.setTextColor(Color_Title == 0 ? pickerview_topbar_title : Color_Title); rv_top_bar.setBackgroundColor(Color_Background_Title == 0 ? pickerview_bg_topbar : Color_Background_Title); //设置文字大小 btnSubmit.setTextSize(Size_Submit_Cancel); btnCancel.setTextSize(Size_Submit_Cancel); tvTitle.setTextSize(Size_Title); tvTitle.setText(Str_Title); } else { customListener.customLayout(LayoutInflater.from(context).inflate(layoutRes, contentContainer)); } // ----滚轮布局 final LinearLayout optionsPicker = (LinearLayout) findViewById(R.id.optionspicker); optionsPicker.setBackgroundColor(Color_Background_Wheel == 0 ? bgColor_default : Color_Background_Wheel); wheelOptions = new WheelOptions(optionsPicker, linkage); wheelOptions.setTextContentSize(Size_Content); wheelOptions.setLabels(label1, label2, label3); wheelOptions.setCyclic(cyclic1, cyclic2, cyclic3); wheelOptions.setTypeface(font); setOutSideCancelable(cancelable); if (tvTitle!= null){ tvTitle.setText(Str_Title); } wheelOptions.setDividerColor(dividerColor); wheelOptions.setDividerType(dividerType); wheelOptions.setLineSpacingMultiplier(lineSpacingMultiplier); wheelOptions.setTextColorOut(textColorOut); wheelOptions.setTextColorCenter(textColorCenter); wheelOptions.isCenterLabel(isCenterLabel); } /** * 设置默认选中项 * * @param option1 */ public void setSelectOptions(int option1) { this.option1 = option1; SetCurrentItems(); } public void setSelectOptions(int option1, int option2) { this.option1 = option1; this.option2 = option2; SetCurrentItems(); } public void setSelectOptions(int option1, int option2, int option3) { this.option1 = option1; this.option2 = option2; this.option3 = option3; SetCurrentItems(); } private void SetCurrentItems() { if(wheelOptions!=null){ wheelOptions.setCurrentItems(option1, option2, option3); } } public void setPicker(List<T> optionsItems) { this.setPicker(optionsItems, null, null); } public void setPicker(List<T> options1Items, List<List<T>> options2Items) { this.setPicker(options1Items, options2Items, null); } public void setPicker(List<T> options1Items, List<List<T>> options2Items, List<List<List<T>>> options3Items) { wheelOptions.setPicker(options1Items, options2Items, options3Items); SetCurrentItems(); } //不联动情况下调用 public void setNPicker(List<T> options1Items, List<T> options2Items, List<T> options3Items) { wheelOptions.setNPicker(options1Items, options2Items, options3Items); SetCurrentItems(); } @Override public void onClick(View v) { String tag = (String) v.getTag(); if (tag.equals(TAG_SUBMIT)) { returnData(); } dismiss(); } //抽离接口回调的方法 public void returnData() { if (optionsSelectListener != null) { int[] optionsCurrentItems = wheelOptions.getCurrentItems(); optionsSelectListener.onOptionsSelect(optionsCurrentItems[0], optionsCurrentItems[1], optionsCurrentItems[2], clickView); } } public interface OnOptionsSelectListener { void onOptionsSelect(int options1, int options2, int options3, View v); } @Override public boolean isDialog() { return isDialog; } }