android 개발의 wheel 컨트롤 사용 설명

외지에서 병이 나지 않으니, 마음대로 약 두 갑에 60여 위안이야.그래, 쓸데없는 소리 하지 마. 오늘 우리는 wheel 컨트롤러의 사용을 보자. 이것은GitHub의 소스 컨트롤러로 사용하기에 매우 편리하다. 우리는 그것으로 많은 일을 할 수 있다. 예를 들어 사용자 정의datepicker를 만들 수 있다. 일부 전자상거래 앱에서 자주 그것으로 성, 시, 현의 3급 연결을 할 수 있다. 어쨌든 용도가 매우 많다.우리 오늘 이 물건을 어떻게 사용하는지 함께 봅시다.
오늘 만들 효과도를 살펴보자.
이것은 우리가 오늘 할 효과도이다.그럼 시작하겠습니다.
1. wheel 획득
wheel은 GitHub의 소스 컨트롤러입니다. GitHub에서 직접 다운로드할 수 있습니다. 주소는https://github.com/maarek/android-wheel다운로드가 끝난 후에 우리는 안에 있는 wheel 파일을library로 직접 사용할 수도 있고, wheel에 있는 자바 클래스와 xml 파일을 프로젝트에 복사해서 사용할 수도 있다.
2. 사용법
먼저 기본 레이아웃 파일을 살펴보겠습니다.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="     " />

    <LinearLayout
        android:id="@+id/content"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/title"
        android:background="@drawable/layout_bg"
        android:orientation="horizontal" >

        <kankan.wheel.widget.WheelView
            android:id="@+id/province_view"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1" >
        </kankan.wheel.widget.WheelView>

        <kankan.wheel.widget.WheelView
            android:id="@+id/city_view"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1" >
        </kankan.wheel.widget.WheelView>

        <kankan.wheel.widget.WheelView
            android:id="@+id/area_view"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1" >
        </kankan.wheel.widget.WheelView>
    </LinearLayout>

    <Button
        android:id="@+id/confirm"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/content"
        android:onClick="onClick"
        android:text="  " />

</RelativeLayout>
자, 메인 레이아웃 파일에서 우리는 세 개의 WheelView를 사용했는데 각각 성, 시, 현을 표시하는 데 사용되었다.MainActivity에서 우리는 먼저 이 세 개의 컨트롤을 가져와야 한다.
provinceView = (WheelView) this.findViewById(R.id.province_view);
		cityView = (WheelView) this.findViewById(R.id.city_view);
		areaView = (WheelView) this.findViewById(R.id.area_view);
받은 후에 우리는 Array Wheel Adapter 데이터 어댑터를 사용하여 데이터 어댑터를 맞추려고 한다. 여기에 두 개의 매개 변수가 필요하다. 하나는 상하문이고 다른 하나는 하나의 수조이다. 이 수조는 바로 우리가 전시해야 할 내용이다. 즉, 우리는 성, 시, 구를 모두 수조로 저장하는 형식이다. 그러나 한 성은 여러 시, 한 시는 여러 개의 현에 대응하고 한 시는 여러 개의 현에 대응한다.성과 현을 연결하기 위해 우리는 맵 집합을 사용해야 하기 때문에 우리가 디자인한 데이터 구조는 다음과 같다.
/**
	 *  
	 */
	private String[] provinceArray;
	/**
	 *  - 
	 */
	private Map<String, String[]> citiesMap;
	/**
	 *  -  
	 */
	private Map<String, String[]> areasMap;
첫 번째 그룹에는 모든 성의 데이터가 저장되고, 두 번째 맵에는 모든 성에 대응하는 시의 데이터가 저장되며, 세 번째 맵에는 모든 시에 대응하는 구와 현의 데이터가 저장된다. 우리는 지금 세 가지 데이터 집합에 값을 부여해야 한다. 먼저 우리의 json 데이터 형식을 살펴보자.
[{"name":"  ","city":[{"name":"  ","area":["   ","   ","   ","   "...]}]}.....]
우리의 json 데이터는 바로 이런 형식이다. json 데이터는 assets 폴더에 존재한다. 다음은 json 데이터를 어떻게 해석하고 위의 세 개의 데이터 집합에 값을 부여하는지 살펴보자.
	private void initJson() {
		citiesMap = new HashMap<String, String[]>();
		areasMap = new HashMap<String, String[]>();
		InputStream is = null;
		try {
			StringBuffer sb = new StringBuffer();
			is = getAssets().open("city.json");
			int len = -1;
			byte[] buf = new byte[1024];
			while ((len = is.read(buf)) != -1) {
				sb.append(new String(buf, 0, len, "gbk"));
			}
			JSONArray ja = new JSONArray(sb.toString());
			provinceArray = new String[ja.length()];
			String[] citiesArr = null;
			for (int i = 0; i < provinceArray.length; i++) {
				JSONObject jsonProvince = ja.getJSONObject(i);
				provinceArray[i] = jsonProvince.getString("name");
				JSONArray jsonCities = jsonProvince.getJSONArray("city");
				citiesArr = new String[jsonCities.length()];
				for (int j = 0; j < citiesArr.length; j++) {
					JSONObject jsonCity = jsonCities.getJSONObject(j);
					citiesArr[j] = jsonCity.getString("name");
					JSONArray jsonAreas = jsonCity.getJSONArray("area");
					String[] areaArr = new String[jsonAreas.length()];
					for (int k = 0; k < jsonAreas.length(); k++) {
						areaArr[k] = jsonAreas.getString(k);
					}
					areasMap.put(citiesArr[j], areaArr);
				}
				citiesMap.put(provinceArray[i], citiesArr);
			}

		} catch (IOException e) {
			e.printStackTrace();
		} catch (JSONException e) {
			e.printStackTrace();
		} finally {
			if (is != null) {
				try {
					is.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
json 해석 기술에 어려운 점이 없다. 이곳의 논리는 약간 복잡하고 세 개의 끼워 넣은 for 순환을 사용했기 때문에 천천히 생각해 봐도 어렵지 않다.자, 데이터 세트에 데이터가 있으면 세 개의 wheel에 어댑터를 설정할 수 있습니다.
	private void initView() {
		provinceView.setViewAdapter(new ArrayWheelAdapter<String>(
				MainActivity.this, provinceArray));
		//              (     )
		cityView.setViewAdapter(new ArrayWheelAdapter<String>(
				MainActivity.this, citiesMap.get("  ")));
		//             
		areaView.setViewAdapter(new ArrayWheelAdapter<String>(
				MainActivity.this, areasMap.get("  ")));

		//        
		provinceView.setCurrentItem(0);
		//        
		cityView.setCurrentItem(0);
		//        
		areaView.setCurrentItem(0);
		//      7 
		provinceView.setVisibleItems(7);
		cityView.setVisibleItems(7);
		areaView.setVisibleItems(7);
		//       
		provinceView.addChangingListener(this);
		cityView.addChangingListener(this);
	}
어댑터를 설치한 후에 우리는 몇 가지 부족한 값을 설정했다. 모두 간단하다. 모두가 직접 주석을 보면 된다. 우리는 두 가지 감청 사건을 설정했다. 우리는 다음과 같다.
@Override
	public void onChanged(WheelView wheel, int oldValue, int newValue) {
		if (wheel == provinceView) {
			//                     
			updateCity();
			updateArea();
		} else if (wheel == cityView) {
			//               
			updateArea();
		}
	}

	private void updateArea() {
		//        City   
		int cityIndex = cityView.getCurrentItem();
		//            
		int provinceIndex = provinceView.getCurrentItem();
		//            
		String proviceName = provinceArray[provinceIndex];
		//             
		String currentName = citiesMap.get(proviceName)[cityIndex];
		//                        
		String[] areas = areasMap.get(currentName);
		//           areaView
		areaView.setViewAdapter(new ArrayWheelAdapter<String>(
				MainActivity.this, areas));
		//        
		areaView.setCurrentItem(0);
	}

	private void updateCity() {
		//            
		int currentIndex = provinceView.getCurrentItem();
		//            
		String currentName = provinceArray[currentIndex];
		//                     
		String[] cities = citiesMap.get(currentName);
		//           cityView
		cityView.setViewAdapter(new ArrayWheelAdapter<String>(
				MainActivity.this, cities));
		//        
		cityView.setCurrentItem(0);
	}
거의 모든 줄 코드에 주석이 있으니 잔소리하지 않겠습니다. 마지막으로 클릭 이벤트를 다시 봅시다.
	public void onClick(View v) {
		//            
		int provinceIndex = provinceView.getCurrentItem();
		//            
		String provinceName = provinceArray[provinceIndex];
		//             
		int cityIndex = cityView.getCurrentItem();
		//             
		String cityName = citiesMap.get(provinceName)[cityIndex];
		//             
		int areaIndex = areaView.getCurrentItem();
		Toast.makeText(
				this,
				"       " + provinceArray[provinceIndex] + cityName
						+ areasMap.get(cityName)[areaIndex], Toast.LENGTH_SHORT)
				.show();
	}
자, 여기서 우리가 원하는 기능은 기본적으로 실현되었다. 그러나 우리는 시스템의 기본 양식이 약간 추하다는 것을 알 수 있다. 그러면 우리는 원본 코드를 수정해서 우리가 원하는 양식을 얻을 수 있다. 먼저 위아래의 검은 쪽은 여기를 볼 수 있다.
private int[] SHADOWS_COLORS = new int[] { 0xFF111111, 0x00AAAAAA,
			0x00AAAAAA };
WheelView.자바 파일에서 이 줄 코드는 상하의 검은색 변의 색 변화를 정의했다. 세 가지 파라미터는 각각 시작 색, 과도 색, 끝날 때의 색이다. 그러면 우리는 이곳의 원본 코드를 수정하여 상하의 검은색 변을 제거할 수 있다. 그리고 중간에 투명한 동쪽의 검은색 변을 바꾸려고 한다. 원본을 통해 이 파일을 찾았다. wheelval.xml:
<shape xmlns:android="http://schemas.android.com/apk/res/android">
	<gradient
		android:startColor="#70222222"
		android:centerColor="#70222222"
		android:endColor="#70EEEEEE"
		android:angle="90" />

	<stroke android:width="1dp" android:color="#70333333" /> 
</shape>
중간에 있는 투명 줄의 양식을 정의하여 우리는 자신의 필요에 따라 수정할 수 있다.자, 이곳의 원본 코드가 많지 않고 어렵지 않으니 여러분이 직접 생각해 보십시오. wheel에 대한 소개는 우리가 이렇게 많이 말할 수 있습니다.
본문 데모 다운로드https://github.com/lenve/wheelTest

좋은 웹페이지 즐겨찾기