Android PickView 高仿ios 時(shí)間選擇器(城市或多級(jí)選擇器) 多種格式任你選擇

先吐槽一下 相關(guān)ui設(shè)計(jì) 一些ui設(shè)計(jì) 跟風(fēng)設(shè)計(jì)很嚴(yán)重 目前的android 設(shè)計(jì)風(fēng)格已經(jīng)出現(xiàn)好幾年了 但是仍然不入市場(chǎng) 一些產(chǎn)品 和 ui 設(shè)計(jì) 更是對(duì)ios 設(shè)計(jì)風(fēng)格喜愛(ài)無(wú)比 目前一些主流的設(shè)計(jì)風(fēng)格 甚至是資源文件都是以ios 為基數(shù)的 ?導(dǎo)致市場(chǎng)上一些app 越來(lái)越ios 風(fēng)格化 傷心五秒鐘 不過(guò)不得不承認(rèn) ios的設(shè)計(jì)風(fēng)格簡(jiǎn)約大方 確實(shí)很美觀 好了 吐槽完畢?

項(xiàng)目開(kāi)發(fā)中 如果你需要一個(gè)年月日時(shí)分秒類型時(shí)間選擇器 用DataPicker和TimePicker聯(lián)動(dòng)去實(shí)現(xiàn)得話 會(huì)非常得不方便 會(huì)碰到布局不協(xié)調(diào)得問(wèn)題 靈活性很低 可實(shí)現(xiàn)的布局也就兩種 所以為了更好的效果 個(gè)人建議你使用 numberPicker 數(shù)字選擇器 去實(shí)現(xiàn) 本人思路是 numberpicker結(jié)合PopupWindow 去實(shí)現(xiàn) 簡(jiǎn)單實(shí)現(xiàn)代碼奉上 歡迎各位大神指正

先看下效果


省市區(qū)三級(jí)城市選擇器


年月日三級(jí)時(shí)間選擇器


好 下面上代碼?


public classTimeViewActivityextendsActivity{ private Context context;

? ? private TextView tv_time_view;

? ? ArrayList options1Items = new ArrayList<>();

? ? ArrayList> options2Items = new ArrayList<>();

? ? ArrayList>> options3Items = new ArrayList<>();

? ? private String city;

? ? @Override? ? protected void onCreate(Bundle savedInstanceState) {

? ? ? ? super.onCreate(savedInstanceState);

? ? ? ? setContentView(R.layout.activity_time_view);

? ? ? ? ? ? initJsonData();

? ? ? ? context = this;

? ? ? ? tv_time_view = (TextView) findViewById(R.id.tv_time_view);

? ? ? ? tv_time_view.setOnClickListener(new View.OnClickListener() {

? ? ? ? ? ? @Override? ? ? ? ? ? public void onClick(View v) {

? ? ? ? ? ? ? // showIOSDate(tv_time_view,TimePickerView.Type.YEAR_MONTH_DAY,"選擇時(shí)間",1);? ? ? ? ? ? ? ? showPickerView();

? ? ? ? ? ? }

? ? ? ? });

? ? }

? ? /**? ? * 時(shí)間選擇器? ? *?

@paramtextView 顯示選擇時(shí)間的控件? ??

?* @paramtype 類型? ?

?* @paramtitle 選擇器彈窗的標(biāo)題? ??

?* @paramflag 返回時(shí)間的格式? ?

?*/? ??

public void showIOSDate(final TextView textView, TimePickerView.Type type, String title, final int flag){

? ? ? ? Calendar instance = Calendar.getInstance();

? ? ? ? instance.add(Calendar.DAY_OF_MONTH,+100);// 選擇時(shí)間的間隔? ? ? ??

TimePickerView pvTime = new TimePickerView.Builder(context, new TimePickerView.OnTimeSelectListener() {

@Override? ? ? ? ? ?

?public void onTimeSelect(Date date2, View v) {//選中事件回調(diào)? ? ? ? ? ? ??

? String time = getTime(date2,flag);// 返回的時(shí)間? ? ? ? ? ? ? ? t

????????extView.setText(time);

? ? ? ? ? ? }

? ? ? ? })

? ? ? ? ? ? ? ? .setType(type)//默認(rèn)全部顯示?

?? ? ? ? ? ? ? .setCancelText("取消")//取消按鈕文字

? ? ? ? ? ? ? ? .setSubmitText("確定")//確認(rèn)按鈕文字

? ? ? ? ? ? ? ? .setContentSize(20)//滾輪文字大小?

?? ? ? ? ? ? ? .setTitleSize(20)//標(biāo)題文字大小??

? ? ? ? ? ? ? .setTitleText(title)//標(biāo)題文字?

?? ? ? ? ? ? ? .setOutSideCancelable(true)//點(diǎn)擊屏幕袖订,點(diǎn)在控件外部范圍時(shí)瀑踢,是否取消顯示? ? ? ? ? ? ? ? .isCyclic(false)//是否循環(huán)滾動(dòng)?

?.setTextColorCenter(Color.BLACK)//設(shè)置選中項(xiàng)的顏色? ? ? ? ? ? ? ? .setTitleColor(getResources().getColor(R.color.textcolors))//標(biāo)題文字顏色? ? ? ? ? ? ? ? .setSubmitColor(getResources().getColor(R.color.textcolorh))//確定按鈕文字顏色? ? ? ? ? ? ? ? .setCancelColor(getResources().getColor(R.color.textcolorh))//取消按鈕文字顏色? ? ? ? ? ? ? ? .setTitleBgColor(getResources().getColor(R.color.colorbg))//標(biāo)題背景顏色 Night mode//? ? ? ? ? ? ? ? ? ? ? ? .setBgColor(0xFF333333)//滾輪背景顏色 Night mode? ? ? ? ? ? ? ? // .setRange(calendar.get(Calendar.YEAR) - 20, calendar.get(Calendar.YEAR) + 20)//默認(rèn)是1900-2100年//? ? ? ? ? ? ? ? ? ? ? ? .setDate(selectedDate)// 如果不設(shè)置的話腐芍,默認(rèn)是系統(tǒng)時(shí)間? ? ? ? ? ? ? ? //calendar.add(Calendar.DAY_OF_MONTH,-1);? ? ? ? ? ? ? ? .setRangDate(Calendar.getInstance(),instance)//起始終止年月日設(shè)定//? ? ? ? ? ? ? ? ? ? ? ? .setLabel("年","月","日","時(shí)","分","秒") ? ? ? ? ? ??

? .isCenterLabel(false) //是否只顯示中間選中項(xiàng)的label文字助隧,false則每項(xiàng)item全部都帶有l(wèi)abel乓旗。? ? ? ? ? ? ? ? .build();

? ? ? ? pvTime.setDate(Calendar.getInstance());//注:根據(jù)需求來(lái)決定是否使用該方法(一般是精確到秒的情況),此項(xiàng)可以在彈出選擇器的時(shí)候重新設(shè)置當(dāng)前時(shí)間,避免在初始化之后由于時(shí)間已經(jīng)設(shè)定,導(dǎo)致選中時(shí)間與當(dāng)前時(shí)間不匹配的問(wèn)題嘱丢。? ? ? ? pvTime.show();

? ? }

? ? /**? ? * 格式化時(shí)間? ??

?* @paramdate 時(shí)間數(shù)據(jù)源? ??

?* @paramtype 時(shí)間返回格式? ??

* @return*/? ??

public String getTime(Date date ,int type) {//可根據(jù)需要自行截取數(shù)據(jù)顯示? ? ? ? SimpleDateFormat format = null;

? ? ? ? if (type==1){

? ? ? ? ? ? format = new SimpleDateFormat("yyyy-MM-dd");

? ? ? ? }else if (type==0){

? ? ? ? ? ? format = new SimpleDateFormat("HH:mm");

? ? ? ? }else {

? ? ? ? ? ? format = new SimpleDateFormat("yyyy-MM-dd HH:mm");

? ? ? ? }

? ? ? ? return format.format(date);

? ? }

? ? public void showPickerView() {

? ? ? ? OptionsPickerView pvOptions=new OptionsPickerView.Builder(TimeViewActivity.this, new OptionsPickerView.OnOptionsSelectListener() {

? ? ? ? ? ? @Override? ? ? ? ? ? public void onOptionsSelect(int options1, int options2, int options3, View v) {

? ? ? ? ? ? ? ? //返回的分別是三個(gè)級(jí)別的選中位置? ? ? ? ? ? ? ? city = options1Items.get(options1).getPickerViewText() +

? ? ? ? ? ? ? ? options2Items.get(options1).get(options2) +

? ? ? ? ? ? ? ? options3Items.get(options1).get(options2).get(options3);

? ? ? ? ? ? ? ? tv_time_view.setText(city);

? ? ? ? ? ? }

? ? ? ? }).setTitleText("")

? ? ? ? ? ? ? ? .setCancelText("取消")

? ? ? ? ? ? ? ? .setSubmitText("選定")

? ? ? ? ? ? ? ? .setTextColorCenter(Color.BLACK)

? ? ? ? ? ? ? ? .setDividerColor(Color.GRAY)

? ? ? ? ? ? ? ? .setOutSideCancelable(false)

? ? ? ? ? ? ? ? .setContentTextSize(25)

? ? ? ? ? ? ? ? .build();

? ? ? ? //? pvOptions.setPicker(options1Items);//一級(jí)選擇器? ? ?

?// pvOptions.setPicker(options1Items, options2Items);//二級(jí)選擇器? ? ? ? pvOptions.setPicker(options1Items, options2Items, options3Items);//三級(jí)選擇器? ? ?

?? pvOptions.show();

? ? }

? ? private void initJsonData() {? //解析數(shù)據(jù)? ? ? ? /**

? ? ? ? * 注意:assets 目錄下的Json文件僅供參考,實(shí)際使用可自行替換文件

? ? ? ? * 關(guān)鍵邏輯在于循環(huán)體

? ? ? ? *

? ? ? ? * */? ? ? ? //? 獲取json數(shù)據(jù)? ? ? ? String JsonData = JsonFileReader.getJson(TimeViewActivity.this, "province_data.json");

? ? ? ? ArrayList jsonBean = parseData(JsonData);//用Gson 轉(zhuǎn)成實(shí)體? ? ? ? /**

? ? ? ? * 添加省份數(shù)據(jù)

? ? ? ? *

? ? ? ? * 注意:如果是添加的JavaBean實(shí)體祠饺,則實(shí)體類需要實(shí)現(xiàn) IPickerViewData 接口越驻,

? ? ? ? * PickerView會(huì)通過(guò)getPickerViewText方法獲取字符串顯示出來(lái)。

? ? ? ? */? ? ? ? options1Items = jsonBean;

? ? ? ? for (int i = 0; i < jsonBean.size(); i++) {//遍歷省份?

?? ? ? ? ? ArrayList CityList = new ArrayList<>();//該省的城市列表(第二級(jí))? ? ? ?

?? ? ArrayList> Province_AreaList = new ArrayList<>();//該省的所有地區(qū)列表(第三極)? ? ?

?? ? ? for (int c = 0; c < jsonBean.get(i).getCityList().size(); c++) {//遍歷該省份的所有城市? ? ? ? ?

?? ? ? String CityName = jsonBean.get(i).getCityList().get(c).getName();

? ? ? ? ? ? ? ? CityList.add(CityName);//添加城市? ? ? ? ? ? ?

?? ArrayList City_AreaList = new ArrayList<>();//該城市的所有地區(qū)列表? ? ? ? ?

?? ? ? //如果無(wú)地區(qū)數(shù)據(jù)道偷,建議添加空字符串缀旁,防止數(shù)據(jù)為null 導(dǎo)致三個(gè)選項(xiàng)長(zhǎng)度不匹配造成崩潰? ? ? ? ? ? ? ? if (jsonBean.get(i).getCityList().get(c).getArea() == null? ? ? ? ? ? ? ? ? ? ? ? || jsonBean.get(i).getCityList().get(c).getArea().size() == 0) {

? ? ? ? ? ? ? ? ? ? City_AreaList.add("");

? ? ? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? ? ? for (int d = 0; d < jsonBean.get(i).getCityList().get(c).getArea().size(); d++) {//該城市對(duì)應(yīng)地區(qū)所有數(shù)據(jù)? ? ? ? ? ? ? ? ? ? ? ? String AreaName = jsonBean.get(i).getCityList().get(c).getArea().get(d);

? ? ? ? ? ? ? ? ? ? ? ? City_AreaList.add(AreaName);//添加該城市所有地區(qū)數(shù)據(jù)? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? Province_AreaList.add(City_AreaList);//添加該省所有地區(qū)數(shù)據(jù)? ? ? ? ? ? }

? ? ? ? ? ? /**

? ? ? ? ? ? * 添加城市數(shù)據(jù)

? ? ? ? ? ? */? ? ? ? ? ? options2Items.add(CityList);

? ? ? ? ? ? /**

? ? ? ? ? ? * 添加地區(qū)數(shù)據(jù)

? ? ? ? ? ? */? ? ? ? ? ? options3Items.add(Province_AreaList);

? ? ? ? }

? ? }

? ? public ArrayList parseData(String result) {//Gson 解析? ? ? ? ArrayList detail = new ArrayList<>();

? ? ? ? try {

? ? ? ? ? ? org.json.JSONArray data = new org.json.JSONArray(result);

? ? ? ? ? ? Gson gson = new Gson();

? ? ? ? ? ? for (int i = 0; i < data.length(); i++) {

? ? ? ? ? ? ? ? JsonBean entity = gson.fromJson(data.optJSONObject(i).toString(), JsonBean.class);

? ? ? ? ? ? ? ? detail.add(entity);

? ? ? ? ? ? }

? ? ? ? } catch (Exception e) {

? ? ? ? ? ? e.printStackTrace();

? ? ? ? ? ? // mHandler.sendEmptyMessage(MSG_LOAD_FAILED);? ? ? ? }

? ? ? ? return detail;

? ? }

}


城市三級(jí)選擇器 需要你找一個(gè)城市資源文件 稍后我會(huì)上傳一個(gè) 有需要可以下載 我會(huì)將代碼 資源 都放進(jìn)去 需要自己復(fù)制黏貼 就可以使用了 簡(jiǎn)單實(shí)用的功能



感謝 csdn nade_s 更多內(nèi)容?

資源下載?相關(guān)資源下載

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市试疙,隨后出現(xiàn)的幾起案子诵棵,更是在濱河造成了極大的恐慌抠蚣,老刑警劉巖祝旷,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡怀跛,警方通過(guò)查閱死者的電腦和手機(jī)距贷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)吻谋,“玉大人忠蝗,你說(shuō)我怎么就攤上這事±焓埃” “怎么了阁最?”我有些...
    開(kāi)封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)骇两。 經(jīng)常有香客問(wèn)我速种,道長(zhǎng),這世上最難降的妖魔是什么低千? 我笑而不...
    開(kāi)封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任配阵,我火速辦了婚禮,結(jié)果婚禮上示血,老公的妹妹穿的比我還像新娘棋傍。我一直安慰自己,他們只是感情好难审,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布瘫拣。 她就那樣靜靜地躺著,像睡著了一般告喊。 火紅的嫁衣襯著肌膚如雪拂铡。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天葱绒,我揣著相機(jī)與錄音感帅,去河邊找鬼。 笑死地淀,一個(gè)胖子當(dāng)著我的面吹牛失球,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播帮毁,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼实苞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了烈疚?” 一聲冷哼從身側(cè)響起黔牵,我...
    開(kāi)封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎爷肝,沒(méi)想到半個(gè)月后猾浦,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體陆错,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年金赦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了音瓷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡夹抗,死狀恐怖绳慎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情漠烧,我是刑警寧澤杏愤,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站已脓,受9級(jí)特大地震影響声邦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜摆舟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一亥曹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧恨诱,春花似錦媳瞪、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至厕鹃,卻和暖如春兢仰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背剂碴。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工把将, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人忆矛。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓察蹲,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親催训。 傳聞我的和親對(duì)象是個(gè)殘疾皇子洽议,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359