Android 조합 컨트롤 기능 이 강 한 사용자 정의 컨트롤 구현

일반적으로 안 드 로 이 드 는 사용자 정의 컨트롤 을 실현 하 는 세 가지 방식 이 아 닙 니 다.
I.기 존의 컨트롤 을 계승 하여 컨트롤 의 기능 을 확대 합 니 다.
II.기 존 컨트롤 을 조합 하여 기능 이 더욱 강 한 컨트롤 을 실현 합 니 다.
Ⅲ、View 를 다시 써 서 새로운 컨트롤 을 실현 합 니 다.
앞에서 말 했 듯 이 기 존의 컨트롤 을 어떻게 계승 하 는 지 는 정의 컨트롤 에서 나 온 것 이다.이 절 에서 우 리 는 두 번 째 의 제 를 토론 한다.어떻게 컨트롤 을 조합 하여 강력 한 사용자 정의 컨트롤 을 실현 합 니까?
조합 컨트롤 을 만 드 는 장점 부터 살 펴 보 자.조합 컨트롤 을 만 들 면 조합 기능 을 가 진 컨트롤 집합 을 잘 만 들 수 있다.그러면 우 리 는 보통 어떻게 하 는 것 입 니까?보통 우 리 는 적당 한 View Group 을 계승 하고 그 에 게 새로운 기능 을 만들어 주 며 새로운 기능 의 컨트롤 을 형성 합 니 다.우 리 는 또한 이 컨트롤 에 새로운 속성 을 지정 하여 그 로 하여 금 매우 좋 은 확장 성 을 가지 게 할 것 이다.자,쓸데없는 말 을 많이 했 습 니 다.다음은 거의 모든 app 에 있 는 컨트롤 인 제목 표시 줄 을 예 로 들 어 조합 컨트롤 방법 을 소개 하 겠 습 니 다.
우선,제목 표시 줄 을 왜 다시 사용 하 는 지 대답 하 겠 습 니 다.
I.응용 프로그램 이 통 일 된 스타일 을 가지 도록 합 니 다.
II.제목 표시 줄 을 다시 사용 하 는 것 도 우리 가 앞으로 제목 표시 줄 을 수정 하 는 것 이 매우 편리 합 니 다.'한 번 의 작성,여기저기 실행'효 과 를 진정 으로 실현 할 수 있 습 니 다.많은 노력 을 들 이지 않 고 모든 페이지 를 수정 할 수 있 습 니 다.
Ⅲ.호출 자 에 게 호출 인 터 페 이 스 를 밖으로 노출 시 켜 제목 표시 줄 을 더욱 유연 하 게 제어 하여 기능 을 더욱 강하 게 한다.
그럼 제목 표시 줄 이 저렇게 생 겼 으 니 다음 그림 을 보십시오.
  
우 리 는 먼저 간단 한 분석 을 해 보 겠 습 니 다.이것 은 사용자 정의 컨트롤 입 니 다.안 드 로 이 드 의 네 이 티 브 컨트롤 처럼 호출 자가 컨트롤 의 속성 을 설정 하 는 데 편리 해 야 합 니 다.따라서 이 컨트롤 에 속성 을 설정 할 필요 가 있 습 니 다.하나의 View 에 사용자 정의 속성 을 제공 하 는 것 은 매우 간단 합 니 다.res 자원 디 렉 터 리 에 있 는 values 디 렉 터 리 에 attrs.xml 속성 파일 을 만 들 고 이 파일 에서 필요 한 속성 을 정의 하면 됩 니 다.이 사용자 정의 컨트롤 사용자 정의 속성 은 다음 과 같 습 니 다.

 <declare-styleable name="titleBar">
  <attr name="title" format="string" />
  <attr name="titleTextSize" format="dimension" />
  <attr name="titleTextColor" format="color" />
  <attr name="titleLeftText" format="string" />
  <attr name="titleLeftBackground" format="color|reference" />
  <attr name="titleLeftTextColor" format="color" />
  <attr name="titleRightText" format="string" />
  <attr name="titleRightBackground" format="color|reference" />
  <attr name="titleRightTextColor" format="color" />
 </declare-styleable>

저 희 는태그 로 사용 할 사용자 정의 속성 을 설명 하고 name 속성 으로 참조 할 이름 을 확인 합 니 다.format 으로 데 이 터 를 인용 하 는 형식 을 확인 합 니 다.이 사용자 정의 컨트롤 사용자 정의 속성 대응 목록 은 다음 과 같 습 니 다.
I.title―제목 에 대응 하 는 문자
Ⅱ、titleTextSize―제목 에 대응 하 는 텍스트 크기
Ⅲ,titleTextColor―제목 에 대응 하 는 텍스트 색상
Ⅳ、title Left Text―왼쪽 단추 에 대응 하 는 텍스트
V.titleLeft Background―왼쪽 단추 에 대응 하 는 배경
VI、title Left TextColor―왼쪽 단추 에 대응 하 는 텍스트 색상
VII、titleRightText―오른쪽 단추 에 대응 하 는 텍스트
V,titleRightBackground―오른쪽 단추 에 대응 하 는 배경
VI、titleRightTextColor―오른쪽 단추 에 대응 하 는 텍스트 색상
여기 서 지적 해 야 할 것 은 좌우 단추 의 배경,즉 색상 유형 일 수도 있 고 해당 하 는 그림 에 대응 할 수도 있 기 때문에 우 리 는'|'로 서로 다른 속성 을 구분 할 수 있다.
자,사용자 정의 속성 에 대한 정의 가 있 으 니 TitleBar 의 컨트롤 을 사용자 정의 하여 이 정 의 된 속성 값 을 가 져 와 야 합 니 다.상기 에서 우 리 는 일반 조합 컨트롤 이 일반적으로 ViewGroup 컨트롤 과 계승 된다 고 언급 했 습 니 다.여기 서 우 리 는 쉽게 볼 수 있 습 니 다.RelativeLayout 를 계승 하 겠 습 니 다.속성 값 을 어떻게 가 져 옵 니까?시스템 은 TypedArray 를 제공 합 니 다.그러면 데이터 구 조 는 속성 집합 을 쉽게 가 져 올 수 있 습 니 다.속성 을 가 져 오 는 코드 는 다음 과 같 습 니 다.

private void initAttrs(AttributeSet attrs) {
  TypedArray ta = this.getContext().obtainStyledAttributes(attrs,
    R.styleable.titleBar);
  if (ta != null) {
   title = ta.getString(R.styleable.titleBar_title);
   titleTextSize = ta.getDimension(R.styleable.titleBar_titleTextSize,
     16);
   titleTextColor = ta
     .getColor(R.styleable.titleBar_titleTextColor, 0);
   titleLeftText = ta.getString(R.styleable.titleBar_titleLeftText);
   titleLeftBackground = ta
     .getDrawable(R.styleable.titleBar_titleLeftBackground);
   titleLeftTextColor = ta.getColor(
     R.styleable.titleBar_titleLeftTextColor, 0);
   titleRightText = ta.getString(R.styleable.titleBar_titleRightText);
   titleRightBackground = ta
     .getDrawable(R.styleable.titleBar_titleRightBackground);
   titleRightTextColor = ta.getColor(
     R.styleable.titleBar_titleRightTextColor, 0);
   ta.recycle();
  }
 }
여기 서 주의해 야 할 것 은 TypedArray 의 recycle 방법 으로 자원 을 회수 해 야 한 다 는 것 이다.
이 조합 컨트롤 에 속성 이 생 긴 후에 다음 과 같이 우리 가 해 야 할 일 은 이 조합 컨트롤 의 단 추 를 텍스트 상자 로 유기 적 으로 조합 하 는 것 입 니 다.조합의 코드 는 다음 과 같 습 니 다.

 private void initView() {
  leftButton = new Button(getContext());
  titleTextView = new TextView(getContext());
  rightButton = new Button(getContext());

  leftButton.setTextColor(titleLeftTextColor);
  leftButton.setBackgroundDrawable(titleLeftBackground);
  leftButton.setText(titleLeftText);

  rightButton.setTextColor(titleRightTextColor);
  rightButton.setBackgroundDrawable(titleRightBackground);
  rightButton.setText(titleRightText);

  titleTextView.setText(title);
  titleTextView.setTextSize(titleTextSize);
  titleTextView.setTextColor(titleTextColor);

  mLeftLayoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT,
    LayoutParams.MATCH_PARENT);
  mLeftLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
  addView(leftButton, mLeftLayoutParams);

  mCenterLayoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT,
    LayoutParams.MATCH_PARENT);
  mCenterLayoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);
  addView(titleTextView, mCenterLayoutParams);

  mRightLayoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT,
    LayoutParams.MATCH_PARENT);
  mRightLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
  addView(rightButton, mRightLayoutParams);
 }
우 리 는 위의 글 에서 일부 속성 을 정의 하 는 것 을 보 았 다.이 조합 컨트롤 을 복사 해서 이 조합 컨트롤 을'피 와 살 이 있다'고 만 들 었 다.
이것 은 사용자 정의 컨트롤 이 므 로 UI 모드 입 니 다.모든 호출 자가 좌우 단 추 를 눌 러 야 합 니 다.이 루어 질 수 있 는 것 이 다 를 수 있 습 니 다.우 리 는 인 터 페 이 스 를 밖으로 노출 시 켜 호출 자가 이 두 단 추 를 유연 하 게 제어 하도록 해 야 합 니 다.그러면 인터페이스의 정 의 는 다음 과 같다.

 public interface ClickListener {
  void Click(int tag);
 }

 private ClickListener listener;

모드 방법 에서 왼쪽,오른쪽 단추 에 클릭 이 벤트 를 추가 하고 인터페이스의 클릭 방법 을 호출 합 니 다.코드 는 다음 과 같 습 니 다.

private void setListener() {
  leftButton.setOnClickListener(this);
  rightButton.setOnClickListener(this);
 }

 @Override
 public void onClick(View v) {
  if (listener != null) {
   if (v == leftButton) {
    listener.Click(LEFT_BUTTON);
   } else if (v == rightButton) {
    listener.Click(RIGHT_BUTTON);
   }
  }

 }

코드 에서 우 리 는 왼쪽 단 추 를 눌 렀 는 지 오른쪽 단 추 를 눌 렀 는 지 효과적으로 판단 합 니 다. 
이 모드 방법 에서 인터페이스의 정의 가 나 온 후에 우 리 는 외부 에서 이 리 셋 코드 를 다음 과 같이 호출 합 니 다.

titleBar.setListener(new ClickListener() {
   
   @Override
   public void Click(int tag) {
    switch (tag) {
   case TitleBar.LEFT_BUTTON:
    Toast.makeText(MainActivity.this, "        ", 0).show();
    break;
   case TitleBar.RIGHT_BUTTON:
    Toast.makeText(MainActivity.this, "        ", 0).show();
    break;
   default:
    break;
   } 
   }
  });

이렇게 하면 외부 에서 좌우 버튼 의 클릭 이 벤트 를 효과적으로 제어 할 수 있 습 니 다.
이렇게 많이 했 는데 이 조합 컨트롤 을 효과적으로 호출 할 수 있 기 를 바 랍 니 다.조합 컨트롤 을 호출 하 는 코드 는 다음 과 같 습 니 다.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:custom="http://schemas.android.com/apk/res/com.example.test"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:padding="5dp"
 tools:context=".MainActivity">

 <!-- <include layout="@layout/topbar" /> -->

 <com.example.test.TitleBar
  android:id="@+id/titleBar"
  android:layout_width="match_parent"
  android:layout_height="40dp"
  custom:titleLeftBackground="@drawable/blue_button"
  custom:titleLeftText="Back"
  custom:titleLeftTextColor="#FFFFFF"
  custom:titleRightBackground="@drawable/blue_button"
  custom:titleRightText="More"
  custom:titleRightTextColor="#FFFFFF"
  custom:title="     "
  custom:titleTextColor="#123412"
  custom:titleTextSize="10sp"/>

</RelativeLayout>

사용자 정의 컨트롤 과 네 이 티 브 컨트롤 호출 의 차 이 는 다음 과 같 습 니 다.
I.사용자 정의 컨트롤 을 참조 하려 면 완전한 클래스 이름 을 참조 해 야 합 니 다.
II.사용자 정의 컨트롤 사용자 정의 속성 을 참조 할 때 사용자 정의 네 임 스페이스 를 참조 해 야 합 니 다.참조 방법 은 다음 과 같 습 니 다.
  xmlns:custom="http://schemas.android.com/apk/res/com.example.test" 
이 컨트롤,최종 실행 효 과 는:

이상 은 본문의 전체 내용 이 므 로 여러분 의 학습 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기