[안드로이드] 이미 존재하는 뷰를 수정하기

반응형




이어지는 글     
커스텀 컴포넌트 만들기       
이미 존재하는 뷰를 수정하기    ◀ 현재 위치

읽기전에 손가락 한번 클릭~ >_<

고마워요 ~ Chu ~ ♥


안드로이드의 커스텀 컴포넌트에 관한 글입니다.


이미 존재하는 뷰를 수정하기

만약 원하는 것과 비슷하지만.. 조금만 다른 컴포넌트가 있다면 좀 더 손쉽게 하기 위하여 해당하는 그 컴포넌트를 상속하고 수정할 부분만 오버라이드 하여 사용하면 되겠죠.

이것은 뷰 계층구조에 알맞은 클래스를 사용함으로써 유용합니다.

이미 존재하는 뷰를 수정하는 예제
예제로서는 샘플 코드의 노트패트 샘플에 보면 EditText 뷰를 확장하여 밑줄이 있는 노트를 만든 것이 있습니다. 이것은 NoteEditor.java 파일 안에 있는 LineEditText 클래스를 보시면 됩니다.




이것도 좀 뜯어 보자면,
1. 클래스를 정의합니다. ( public static LineEditText extends EditText )
◎ 이것은 NoteEditor 액티비티 내의 내부클래스로 정의되어 있고, 외부에서 필요시 접근할 수 있도록 하기 위해 public 접근자를 가지네요. ( 외부에선 NoteEditor.LineEditText 로 접근 ) . 또한 static 으로 선언되어 있기 때문에 부모클래스로부터 데이터 접근에 대한 메소드가 없다는걸 의미합니다.

이것은 NoteEditor 클래스와 강하게 연결된 클래스 라기 보다는, 분리된 클래스로써 동작함을 의미하는데요, 이런 방법은 외부로부터 메소드에 접근이 없는 내부클래스를 만드는 좋은 방법이며, 작고 , 다른 클래스로부터 쉽게 사용될 수 있다는 장점이 있습니다.

EditText 를 상속합니다. 상속하여 커스텀 뷰를 만들고, 만들어진 뷰를 기존의 것과 대체해 버립니다.


2. 클래스 초기화를 설정합니다. 이때 super 생성자를 먼저 호출해 줍니다. ( 디폴트 생성자가 아닌 인자를 가지는 생성자 )
◎ EditText 는 XML 로부터 전개될 때 이러한 파라미터를 가지고 생성되는데요, 이때 생성자는 파라미터를 얻고 슈퍼클래스의 생성자를 호출하는 두 가지의 일을 해야 합니다.


3. 메소드를 오버라이드 합니다 . 이 예제에선 onDraw() 메소드만 오버라이드 했네요.
◎ onDraw() 를 오버라이드 하여 EditText 뷰 캔버스에 선을 그릴수 있게 되었습니다. 또한 캔버스는 오버라이드 된 onDraw() 에 전달됩니다.

-> 슈퍼클래스 메소드인 super.onDraw() 는 무조건 호출해야되는데, 이때 onDraw() 메소드가 끝나기전에 호출해야 됩니다. 편의상 모든 그리기를 끝낸 후에 마지막에 호출했네요


4. 커스텀 컴포넌트를 사용합니다. 위에처럼 만들어진 커스텀 컴포넌트를 노트패드에서는 레이아웃에서 직접 사용합니다. res/layout 의 note_editor.xml 을 보면 이렇게 되어 있군요.


커스텀 컴포넌트는 XML 에서 일반 뷰로 생성됩니다. 또 해당 클래스는 패키지명을 모두 적어주어야만 하는데요. 내부 클래스를 참조할 때 쓰인 ' NoteEditor$LineEditText ' 는 자바에서 내부클래스를 참조할 때 쓰는 표준 방법 입니다.


만약, 커스텀 컴포넌트가 내부클래스가 아니라면 Class 속성을 빼야겠죠. 또 XML 엘리먼트 이름을 가진 뷰로 선언해야 합니다.



이제 이 안에 있는 속성과 파라미터들은 커스텀 컴포넌트 생성자에게 전달될 것입니다. 결국 EditText 생성자에도 전달이 되겠지요.
그러므로 이것은 EditText 뷰에서 사용하는 파라미터들과 동일합니다.
그리고 자신만의 파라미터를 추가하는 것도 가능하기 때문에 커스텀 컴포넌트의 장점을 살릴 수 있겠네요~





커스텀 컴포넌트에 관한 글이었습니다.

 


반응형

댓글

Designed by JB FACTORY