欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android仿Boss直聘文本日期混合滾輪選擇器示例

 更新時間:2018年02月13日 11:50:50   作者:lindroid  
這篇文章主要介紹了Android仿Boss直聘文本日期混合滾輪選擇器示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

1、需求分析

GitHub上面有一款iOS風(fēng)格的滾輪選擇器Android-PickerView,它分為時間選擇器代碼TimePickerView和選項選擇器OptionsPickerView,不但可以選擇時間日期,可以選擇我們自定義的數(shù)據(jù),比如性別、年齡等。我一直都用它。直到最近遇到了一個需求,它的選項里面既有文字也有時間,大體效果如Boss直聘添加項目經(jīng)驗中的時間選擇功能:

從圖中我們可以看出,除了常規(guī)的年份和月份的選擇,選項中還包含了文本。其中,最新的時間是“至今”,而最早可供選擇的時間則是“1900以前”。所以看起來似乎TimePickerViewOptionsPickerView都無法實現(xiàn)這個功能。我們都沮喪地認(rèn)為這下要么得自定義控件,要么得修改Android-PickerView這個庫了。但我轉(zhuǎn)念一想,為什么要把“時間選擇”和“選項選擇”分得那么開呢?時間選擇其實也是選項選擇的一種嘛。比如我要選擇2017年12月,那就是從年份中選擇2017,從月份中選擇12。只要設(shè)置好一級選項和二級選項就可以了。

2、選項結(jié)構(gòu)分析

有了思路之后,我們來分析一下選項的數(shù)據(jù)結(jié)構(gòu)。年份可以分為3種情況:

  1. 最新年份,其實也是最新的時間:“至今”;
  2. 常規(guī)的年份:1990~當(dāng)前年份(2018);
  3. 最早的年份,也就是最早的時間:“1990以前”。

我在Boss直聘的基礎(chǔ)上加了一些限制:當(dāng)前年份下對應(yīng)的可供選擇的月份范圍只能是從月到當(dāng)前月份,比如現(xiàn)在是2018年2月,那么選好年份為2018后,月份就只能選擇1和2。這樣一來,月份就有四種情況了:

  1. 最新月份:“至今”;
  2. 當(dāng)前年份下對應(yīng)的月份范圍:1~當(dāng)前月份;
  3. 完整的月份,即1~12;
  4. 最早月份:“1990以前”。

可以總結(jié)為如下的表格:

年份 月份
最新年份“至今” 最新年份“至今”
當(dāng)前年份 1~當(dāng)前月份
1990~當(dāng)前年份-1 月份1~12
最早年份“1990以前” 最早月份“1990以前”

3、書寫代碼

在開始寫代碼之前,我建議你先去GitHub上看看Android-PickerView的使用用法,它使用了構(gòu)造者模式,用起來很簡單。

現(xiàn)在,就開始寫我們的代碼了。

3.1 界面布局

布局就是一個按鈕,點擊后彈出滾輪選擇器,選好后點擊確認(rèn)即將數(shù)據(jù)在TextView上顯示出來。

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

  <Button
    android:textAllCaps="false"
    android:text="顯示PickerView"
    android:onClick="showPickerView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

  <TextView
    android:id="@+id/tv_time"
    android:textSize="16sp"
    android:gravity="center"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />
</LinearLayout>

3.2 Activity代碼

借助強(qiáng)大的PickerView,我們實現(xiàn)起來很簡單,請看如下的代碼:

public class MultipleOptionActivity extends AppCompatActivity {

  private TextView tvTime;

  /**
   * 完整的月份數(shù)據(jù)1~12
   */
  private List<String> monthList = new ArrayList<>();
  /**
   * 滾輪選擇器中年份的選項數(shù)據(jù)
   */
  private List<String> optionYears = new ArrayList<>();
  /**
   * 滾輪選擇器中月份的選項數(shù)據(jù)
   */
  private List<List<String>> optionMonths = new ArrayList<>();

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_multiple_option);
    tvTime = (TextView) findViewById(R.id.tv_time);
    initData();
  }

  /**
   * 初始化數(shù)據(jù)
   */
  private void initData() {
    //設(shè)置完整的月份數(shù)據(jù),即1~12
    for (int i = 1; i <= 12; i++) {
      monthList.add(String.valueOf(i));
    }
    Calendar calendar = Calendar.getInstance();
    int curYear = calendar.get(Calendar.YEAR);
    //月份獲取到的數(shù)據(jù)是0~11,所以要加1
    int curMonth = calendar.get(Calendar.MONTH) + 1;
    for (int i = curYear + 1; i >= 1989; i--) {
      //對應(yīng)年份的月份數(shù)據(jù)集合
      List<String> tempMonths = new ArrayList<>();
      if (i == curYear + 1) {
        //設(shè)置最新時間“至今”
        optionYears.add("至今");
        tempMonths.add("至今");
        optionMonths.add(tempMonths);
      } else if (i == curYear) {
        //設(shè)置當(dāng)前年份及其對應(yīng)的月份
        optionYears.add(String.valueOf(i));
        for (int j = 1; j <= curMonth; j++) {
          tempMonths.add(String.valueOf(j));
        }
        optionMonths.add(tempMonths);
      } else if (i == 1989) {
        //設(shè)置最早時間“1900以前”
        optionYears.add("1990以前");
        tempMonths.add("1990以前");
        optionMonths.add(tempMonths);
      } else {
        //設(shè)置常規(guī)時間
        optionYears.add(String.valueOf(i));
        optionMonths.add(monthList);
      }
    }
  }
  /**
   * 顯示滾輪
   *
   * @param view
   */
  public void showPickerView(View view) {
    OptionsPickerView multipleOp = new OptionsPickerView.Builder(this, new OptionsPickerView.OnOptionsSelectListener() {
      @Override
      public void onOptionsSelect(int options1, int options2, int options3, View v) {
        if (options1 == 0 || options1 == optionYears.size() - 1) {
          //選中最新和最早時間時直接顯示文字,不需要拼接月份
          tvTime.setText(optionYears.get(options1));
        } else {
          //常規(guī)的時間,需要拼接年份和月份
          tvTime.setText(new StringBuffer(optionYears.get(options1)).append("—").append(monthList.get(options2)));
        }
      }
    }).setTitleText("請選擇時間")
        .build();
    multipleOp.setPicker(optionYears, optionMonths);
    multipleOp.show();
  }
}

代碼很少,注釋我也寫得很清楚了,相信大家很容易理解。我們重點關(guān)注OptionsPickerViewsetPicker方法,它可以傳入三個參數(shù),每個參數(shù)都是集合,但每個參數(shù)的類型都不同。第一個參數(shù)是List,第二個參數(shù)是List<List>,第三個參數(shù)是List<List<list>>??吹竭@里你就明白了,我們每個年份對應(yīng)的月份數(shù)據(jù)就是一個集合(當(dāng)然,集合大小不相同),比如年份2017,對應(yīng)的月份就是有著12個元素的集合。理清楚這一點之后,也就理解initData方法里面對數(shù)據(jù)的設(shè)置了。

最后在TextView中顯示數(shù)據(jù)時自然也要分類了,對于“至今”和“1990以前”我們至今顯示文本,其他的再拼接一下,看起來像是時間就行了。

看看我們最后實現(xiàn)的效果圖:

4、總結(jié)

在項目中使用一些好的第三方庫是可以大大節(jié)省我們的開發(fā)時間的,但是在使用過程中也要靈活一點。比如我們在一個頁面中需要多次用到滾輪選擇器(比如選擇開始時間和結(jié)束時間),那么每次都要設(shè)置一遍滾輪的樣式和寫一次點擊事件也太麻煩了。這時,我們就可以將滾輪樣式的設(shè)置代碼抽取出來:

  /**
  * 設(shè)置滾輪樣式
  * @return
  */
  private OptionsPickerView.Builder createBuilder(){
    OptionsPickerView.Builder builder = new OptionsPickerView.Builder(MultipleOptionActivity.this,this)
        .setBgColor(ContextCompat.getColor(this,R.color.colorAccent))
        .setSubmitText("確定")
        .setCancelText("取消");
    //下面可以繼續(xù)設(shè)置樣式
    return builder;
  }

然后顯示滾輪的時候只要這樣寫:

OptionsPickerView op = createBuilder().build();
op.setPicker(數(shù)據(jù)1,數(shù)據(jù)2);
op.show();

點擊事件也可以封裝起來,讓我們的Activity繼承OptionsPickerView.OnOptionsSelectListener,然后實現(xiàn)點擊事件:

  /**
   * 滾輪的監(jiān)聽事件
   * @param options1
   * @param options2
   * @param options3
   * @param v
   */
  @Override
  public void onOptionsSelect(int options1, int options2, int options3, View v) {
    switch (v.getId()){
      //根據(jù)所點擊的控件Id來區(qū)分點擊事件
      case R.id.btn_show:
        break;
      default:
        break;
    }
  }

那么OptionsPickerView怎么獲取到點擊View的id的呢?我們在調(diào)用show方法的時候傳入點擊View的對象就可以了。以上是我個人的一點心得,希望對大家有所幫助。

最后給一下源碼吧:源碼

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android 動態(tài)注冊監(jiān)聽網(wǎng)絡(luò)變化實例詳解

    Android 動態(tài)注冊監(jiān)聽網(wǎng)絡(luò)變化實例詳解

    這篇文章主要介紹了Android 動態(tài)注冊監(jiān)聽網(wǎng)絡(luò)變化實例詳解的相關(guān)資料,這里提供簡單實例及實現(xiàn)效果圖,需要的朋友可以參考下
    2017-07-07
  • 分享Android仿刮獎效果控件

    分享Android仿刮獎效果控件

    這篇文章主要為大家分享了Android仿刮獎效果控件,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Android中viewPager使用指南

    Android中viewPager使用指南

    這是谷歌官方給我們提供的一個兼容低版本安卓設(shè)備的軟件包,里面包囊了只有在安卓3.0以上可以使用的api。而viewpager就是其中之一利用它,我們可以做很多事情,從最簡單的導(dǎo)航,到頁面菜單等等。那如何使用它呢
    2016-01-01
  • android中GridView實現(xiàn)點擊查看更多功能示例

    android中GridView實現(xiàn)點擊查看更多功能示例

    本篇文章主要介紹了android中GridView實現(xiàn)點擊查看更多功能示例,非常具有實用價值,需要的朋友可以參考下。
    2017-02-02
  • android仿微信好友列表功能

    android仿微信好友列表功能

    這篇文章主要介紹了android仿微信好友列表功能,本文通過實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2018-04-04
  • Android模仿用戶設(shè)置密碼實例

    Android模仿用戶設(shè)置密碼實例

    首先有2個對話框,沒有設(shè)置過密碼,需要設(shè)置dialog_set_password.xml,用戶設(shè)置過密碼,不需要設(shè)置,直接輸入密碼dialog_input_password.xml,具體實現(xiàn)代碼,大家參考下本文
    2017-03-03
  • Kotlin List與Set和Map實例講解

    Kotlin List與Set和Map實例講解

    集合是可變數(shù)量(可能為0)的一組條目,kotlin標(biāo)準(zhǔn)庫提供一個整套用于集合管理的工具,各種集合對于解決問題都具有重要意義,并且經(jīng)常用到。kotlin中的集合與Java基本類似
    2022-10-10
  • android將搜索引擎設(shè)置為中國雅虎無法搜索問題解決方法

    android將搜索引擎設(shè)置為中國雅虎無法搜索問題解決方法

    android 進(jìn)入搜索,將搜索引擎設(shè)置為中國雅虎,無法搜索到相關(guān)網(wǎng)絡(luò)結(jié)果,該問題是由于yahoo的搜索接口改變導(dǎo)致,具體解決方法如下,感興趣的朋友可以參考下哈
    2013-06-06
  • Android設(shè)置拍照或者上傳本地圖片的示例

    Android設(shè)置拍照或者上傳本地圖片的示例

    本篇文章主要介紹了Android設(shè)置拍照或者上傳本地圖片示例,可以拍照或者上傳本地文件,有需要的可以了解一下。
    2016-11-11
  • Android實現(xiàn)的簡單藍(lán)牙程序示例

    Android實現(xiàn)的簡單藍(lán)牙程序示例

    這篇文章主要介紹了Android實現(xiàn)的簡單藍(lán)牙程序,結(jié)合實例形式分析了Android藍(lán)牙程序的原理與客戶端、服務(wù)器端具體實現(xiàn)步驟,需要的朋友可以參考下
    2016-10-10

最新評論