Android Boss 직 고용 텍스트 날짜 혼합 롤러 선택 기 예시

1.수요 분석
GitHub 에는 iOS 스타일 의 롤러 선택 기 Android-PickerView 이 있 습 니 다.시간 선택 기 코드 TimePickerView 과 옵션 선택 기 OptionsPickerView 으로 나 뉘 는데 시간 날 짜 를 선택 할 수 있 을 뿐만 아니 라 성별,연령 등 사용자 정의 데 이 터 를 선택 할 수 있 습 니 다.나 는 줄곧 그것 을 썼 다.최근 에 수요 가 생 겼 습 니 다.이 옵션 은 문자 도 있 고 시간 도 있 습 니 다.대체적으로 Boss 직 고용 이 프로젝트 경험 에서 의 시간 선택 기능 을 추가 하 는 것 과 같 습 니 다.


그림 에서 알 수 있 듯 이 일반적인 연도 와 달의 선택 을 제외 하고 옵션 에 텍스트 도 포함 되 어 있다.그 중에서 최신 시간 은'지금까지'이 고 가장 먼저 선택 할 수 있 는 시간 은'1900 이전'이다.그래서 TimePickerViewOptionsPickerView 모두 이 기능 을 실현 하지 못 하 는 것 처럼 보인다.우 리 는 모두 이번 에는 컨트롤 을 사용자 정의 하거나 Android-PickerView 라 이브 러 리 를 수정 해 야 한다 고 낙담 했다.그런데 왜'시간 선택'과'옵션 선택'을 그렇게 나 누 었 을 까?시간 선택 도 선택 이 잖 아.예 를 들 어 저 는 2017 년 12 월 을 선택 하 겠 습 니 다.그것 은 바로 년도 에서 2017 을 선택 하고 달 에서 12 를 선택 하 는 것 입 니 다.1 급 옵션 과 2 급 옵션 만 설정 하면 됩 니 다.
2.옵션 구조 분석
사고방식 이 생 긴 후에 우 리 는 옵션 의 데이터 구 조 를 분석 해 보 자.연 도 는 세 가지 상황 으로 나 눌 수 있다.
  • 최신 년도 이 고 사실은 최신 시간 이다.'지금까지'.
  • 일반적인 년도:1990~현재 년도(2018);
  • 최초의 년도,즉 최초의 시간:'1990 이전'.
  • 저 는 Boss 직 고용 을 바탕 으로 제한 을 가 했 습 니 다.현재 년도 에 대응 하 는 선택 할 수 있 는 월 범 위 는 월 에서 현재 달 까지 만 가능 합 니 다.예 를 들 어 지금 은 2018 년 2 월 이 라면 연 도 를 2018 년 으로 선택 한 후에 월 은 1 과 2 만 선택 할 수 있 습 니 다.이렇게 되면 달 에는 네 가지 상황 이 있다.
  • 최신 월:"지금까지";
  • 현재 년도 에 대응 하 는 월 범위:1~현재 월;
  • 온전한 달,즉 1~12;
  • 최초의 달:"1990 이전".
  • 다음 표 로 요약 할 수 있 습 니 다.
    햇수
    월.
    최신 년도"지금까지"
    최신 년도"지금까지"
    현재 연도
    1~현재 월
    1990~현재 년도-1
    월 1~12
    최초 년도"1990 이전"
    최초 달"1990 이전"
    3.코드 작성
    코드 를 쓰기 전에 GitHub 에 가서 Android-PickerView 의 사용 방법 을 살 펴 보 는 것 이 좋 습 니 다.구조 자 모드 를 사용 하여 사용 하기 가 간단 합 니 다.
    이제 우리 의 코드 를 쓰기 시작 했다.
    3.1 인터페이스 레이아웃
    레이아웃 은 버튼 입 니 다.클릭 한 후 롤러 선택 기 를 꺼 내 고 선택 한 후 클릭 하여 곧 데이터 가 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 코드
    강력 한 PickerView 를 통 해 우 리 는 실현 하기 가 매우 간단 합 니 다.다음 코드 를 보십시오.
    
    public class MultipleOptionActivity extends AppCompatActivity {
    
      private TextView tvTime;
    
      /**
       *        1~12
       */
      private List<String> monthList = new ArrayList<>();
      /**
       *              
       */
      private List<String> optionYears = new ArrayList<>();
      /**
       *              
       */
      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();
      }
    
      /**
       *      
       */
      private void initData() {
        //         , 1~12
        for (int i = 1; i <= 12; i++) {
          monthList.add(String.valueOf(i));
        }
        Calendar calendar = Calendar.getInstance();
        int curYear = calendar.get(Calendar.YEAR);
        //         0~11,    1
        int curMonth = calendar.get(Calendar.MONTH) + 1;
        for (int i = curYear + 1; i >= 1989; i--) {
          //           
          List<String> tempMonths = new ArrayList<>();
          if (i == curYear + 1) {
            //      “  ”
            optionYears.add("  ");
            tempMonths.add("  ");
            optionMonths.add(tempMonths);
          } else if (i == curYear) {
            //             
            optionYears.add(String.valueOf(i));
            for (int j = 1; j <= curMonth; j++) {
              tempMonths.add(String.valueOf(j));
            }
            optionMonths.add(tempMonths);
          } else if (i == 1989) {
            //      “1900  ”
            optionYears.add("1990  ");
            tempMonths.add("1990  ");
            optionMonths.add(tempMonths);
          } else {
            //      
            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 {
              //     ,         
              tvTime.setText(new StringBuffer(optionYears.get(options1)).append("―").append(monthList.get(options2)));
            }
          }
        }).setTitleText("     ")
            .build();
        multipleOp.setPicker(optionYears, optionMonths);
        multipleOp.show();
      }
    }
    코드 가 매우 적 고 주석 도 잘 썼 으 니 여러분 들 이 쉽게 이해 하 실 거 라 고 믿 습 니 다.우 리 는 OptionsPickerViewsetPicker 방법 에 중점 을 두 었 다.이 방법 은 세 개의 매개 변 수 를 전달 할 수 있 고 모든 매개 변 수 는 집합 이지 만 매개 변수의 유형 은 다르다.첫 번 째 매개 변 수 는 List 이 고 두 번 째 매개 변 수 는 List<List> 이 며 세 번 째 매개 변 수 는 List<List<list>> 이다.여기 서 보면 알 수 있 듯 이 우리 가 매년 대응 하 는 월 데 이 터 는 하나의 집합(물론 집합 크기 가 다르다)이다.예 를 들 어 년도 2017,대응 하 는 달 은 12 개의 요소 의 집합 이다.이 점 을 정리 한 후에 initData 방법 에서 데이터 에 대한 설정 도 이해 했다.
    마지막 으로 TextView 에 데 이 터 를 표시 할 때 자 연 스 럽 게 분 류 됩 니 다.'지금까지'와'1990 이전'에 대해 우 리 는 지금까지 텍스트 를 표시 하고 다른 것 은 다시 연결 하면 시간 처럼 보이 면 됩 니 다.
    우리 가 마지막 으로 실현 한 효과 도 를 보 자.

    4.총화
    프로젝트 에서 좋 은 제3자 라 이브 러 리 를 사용 하면 우리 의 개발 시간 을 크게 절약 할 수 있 지만 사용 과정 에서 도 유연 해 야 한다.예 를 들 어 우 리 는 한 페이지 에서 롤러 선택 기(예 를 들 어 시작 시간 과 끝 시간 선택)를 여러 번 사용 해 야 한다.그러면 매번 롤러 의 스타일 을 설정 하고 클릭 이 벤트 를 한 번 쓰 는 것 도 너무 번거롭다.이때,우 리 는 롤러 스타일 의 설정 코드 를 추출 할 수 있다.
    
      /**
      *       
      * @return
      */
      private OptionsPickerView.Builder createBuilder(){
        OptionsPickerView.Builder builder = new OptionsPickerView.Builder(MultipleOptionActivity.this,this)
            .setBgColor(ContextCompat.getColor(this,R.color.colorAccent))
            .setSubmitText("  ")
            .setCancelText("  ");
        //          
        return builder;
      }
    그리고 롤러 를 표시 할 때 이렇게 쓰 면:
    
    OptionsPickerView op = createBuilder().build();
    op.setPicker(  1,  2);
    op.show();
    클릭 이벤트 도 봉인 할 수 있 습 니 다.우리 의 Activity 가 OptionsPickerView.OnOptionsSelectListener 을 계승 한 다음 에 클릭 이 벤트 를 실현 할 수 있 습 니 다.
    
      /**
       *        
       * @param options1
       * @param options2
       * @param options3
       * @param v
       */
      @Override
      public void onOptionsSelect(int options1, int options2, int options3, View v) {
        switch (v.getId()){
          //        Id       
          case R.id.btn_show:
            break;
          default:
            break;
        }
      }
    그렇다면 OptionsPickerView 은 View 를 클릭 한 아 이 디 를 어떻게 얻 었 을 까?우 리 는 show 방법 을 호출 할 때 View 를 클릭 한 대상 을 입력 하면 된다.이상 은 저의 개인 적 인 소감 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.
    마지막 으로 소스 코드 주세요:소스 코드
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기