2014년 3월 1일 토요일

[Design Patter] Observer Pattern, 신문사와 구독자의 관계

** 옵저버패턴

옵저버 패턴은 크게 Subject와 Observer로 구성된다.
이둘의 관계는 신문사와 구독자의 관계로 비유할 수 있다.

1) Subject : 변경된 정보를 Observer에 제공하는 입장이다. 신문사에 해당한다. 정보 변경을 Observer에 갱신해 주는 역할을 한다. 
Subject interface를 구현하고, 
- registerObserver()
- removeObserver()
- notifyObservers()
를 포함한다.

2) Observer : 변경된 정보를 Subject에서 받아본다. 구독자에 해당한다. 정보 변경을 Subject에서 보내주면 그에 따라 정보를 갱신한다.
Observer interface를 구현하고,
- update()
를 포함한다.

[Android] implementation of view by programmatically (setting size, alignment, etc.)

안드로이드 화면을 hard하게 코딩해보았다.
그런데 문제가 화면 만드는 것 까지는 지난번에 해봐서 괜찮았는데,
만들어진 화면의 크기 조정이나, 화면들간의 위치 조정이 문제였다.

하지만

구글링 + stackoverflow + 책 = 해결

까먹으면 억울하니 기록으로 남겨보자.


1) view 생성

일단 지난번에 해보긴 했지만 또 언제 까먹을지 모르므로 적어놓으련다.

View viewName = new View(this); //해당 View 객체 생성
a) TextView의 경우
viewName.setText(string);

b) ImageView의 경우
viewName.setImageResource(R.drawable.id);


1-1) view 크기 조절
view 크기 설정은 view의 속성을 직접 제어하는 것이 아니라, LayoutParams 객체를 새로 생성해서 view를 부모 view에 add할때 함께 add한다.

ex) 부모 view = RelativeLayout, 자식 view = TextView
RelativeLayout relativeLayout = new RelativeLayout(this);
TextView textView = new TextView(this);
textView.setText("테스트중");
textView.setTextSize(20);
RelativeLayout.LayoutParams textParams = new RelativeLayout.LayoutParams(
              RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT)
// --> new ~~~.LayoutParams(가로크기, 세로크기);
relativeLayout.addView(textView, textParams);


1-2) view 속성 설정
view의 속성 같은 경우에도 LayoutParams 객체를 이용한다.
RelativeLayout의 경우 addRule을 통해서 부모, 형제들간의 상대 위치를 설정한다.

ex1) RelativeLayout에서 부모와의 상대 위치 결정(ex에 이어서)
textParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
// 부모 view 맨 위에

ex2) RelativeLayout에서 형제와의 상대 위치 결정
ImageView imageVIew = new ImageView(this);
imageView.setImageResource(R.drawable.testImage);
textParams.addRule(RelativeLayout.BELOW, imageView.getId());
// imageView의 아래에 textView가 위치하도록 params를 설정하였다.
// -->~~.addRule(상대위치속성, 기준형제뷰 ID)

ex3) Margin설정
textParams.setMargins(20, 0, 0, 10);
// ~~.setMargins(left, top, right, bottom);

c.f) LayoutGravity 설정
textParams.gravity = Gravity.RIGHT;
// 오른쪽으로 정렬된다.
textParams.gravity = Gravity.RIGHT | Gravity.BOTTOM;
// 오른쪽 아래로 정렬. ' | ' 를 이용하면 여러 방향을 동시에 정할 수 있다.

c.f2) Padding 설정
textView.padding = (30, 30, 30, 30);
// padding은 view의 필드중 하나로 직접 조정한다.

결론 : params는 크기 + 다른 element와의 관계를 설정할때 사용한다.


2) view group생성
별거 없다.
위에서도 언급했듯이.
RelativeLayout relativeLayout = new RelativeLayout(this);
와 같이 정의하고 최상위 뷰일 경우 xml에서 조정하고, 아닐 경우 상위 뷰의 params 지정해서 상위 뷰에 add해주면된다.
나머지는 view group도 view의 일종이기 때문에 똑같음.

3) view를 view group에서 지우기
relativeLayout.removeView(textView);
//viewGroup.removeView(View);
와 같은식으로 삭제한다.
한줄이면 된다.