간단하게 기능은 View랑 contentView를 자동으로 설정해주는것에 있습니다.
저는 최대한 코딩이 깔끔하게 보이는것을 선호하기 때문에 View를 설정할때 findVIewById 라는 메소드로 설정을 하는데
그것이 1,2개가 아닌 몇십개가 됬을때 상당히 보기가 싫더라구여 그래서 그것을 자동으로 설정할수 있게 해줌으로서
기본 Activity의 코드 소스를 몇줄 줄일수 잇게 제작을 해봤습니다.
그것에 대해 몇가지 제약이 있는데요.
1. 액티비티 클래스와 Layout클래스와의 네이밍 규칙
2. View 멤버 변수 네이밍 규칙
밑에는 제 블로그에서 퍼온 자료입니다.
여러분이 보시기에는 어떠신가요??
간단한 샘플
1 2 3 4 5 6 7 8 9 10 11 | public class Main extends Activity { private TextView mTextView; @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.main); mTextView = (TextView)findViewById(R.id.textView); mTextView.setText( "안녕" ); } } |
위의 소스가 SimpleAutoActivity를 상속받으면 소스가 현저하게 바뀝니다..
1 2 3 4 5 6 7 8 9 | public class Main extends SimpleAutoActivity { private TextView mTextView; @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); mTextView.setText( "안녕" ); } }
|
멤버필드를 초기화 하는것을 상속을 통해서 해결하려는것은 그리 좋은 모델이 아닙니다.
그리고 가독하는데 있어서도 문제가 되고요
initView() 메서드를 통해서 따로 떼어 놓는게 제일 좋아 보입니다.
소스가 깔끔해 보이는것과 라인수가 줄어 드는것에는 별로 도움이 안될수 있으나..
성능과 가독성에는 상속보다는 메서드를 통해서 해결하는게 더 좋습니다.
막상써보면 가독성이 좀 떨어져요.
전 뷰만큼은 액티비티 안에서 제어해야한다는게 제 주관이거든요
저렇게 상위로 빠지면 나중에 3달만지나도 어느 뷰랑 연결되었더라?라는
생각을 하시게됩니다.
저도 기존의 어노테이션 방식으로 쓰다가 그걸 응용해서 네이밍을 이용해 리플렉션으로 자동 find해주는 방식을 선택해봤고 ,
액티비티의 뷰가 아무리 많아봤자 100개 이상이 되는경우는 드물어서 가독성의 문제까지 일어나지 않을꺼라고 예상했는데..
좀더 테스트를 해바야겠네여
토스트 메세지, ProgressDialog, AlertDialog, 타이틀바 라벨 지정을 쉽게하기 위해서
상위 Activity 클래스를 이어 상속받아 쓰고 있습니다.
규칙만 명확하고 가독성 있게 구성한다면..좋을듯~
roboguice도 있죠. 아마 이방면에 가장 유명한 프레임웍이 아닐까 싶습니다. http://code.google.com/p/roboguice/
뷰가 몇십개 이상이 됬을 때, 모든 변수의 이름과 기능을 외우지 않는이상 많이 복잡할것 같네요.
저같은 경우엔 뷰가 어디에 붙었고 어떤 의도로 넣었는지 헷갈릴때 Eclipse 의 찾아가기 기능을 이용해서 R.id.text1 을 Ctrl+좌클릭하면 해당 XML파일을 열고 뷰로 바로 이동을 하거든요.
이 방면으로는 aquery가 갑아닌가요?ㅋㅋ
http://code.google.com/p/android-query/
Before AQuery:
public void renderContent(Content content, View view) {
ImageView tbView = (ImageView) view.findViewById(R.id.icon);
if(tbView != null){
tbView.setImageBitmap(R.drawable.icon);
tbView.setVisibility(View.VISIBLE);
tbView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
someMethod(v);
}
});
}
TextView nameView = (TextView) view.findViewById(R.id.name);
if(nameView != null){
nameView.setText(content.getPname());
}
TextView timeView = (TextView) view.findViewById(R.id.time);
if(timeView != null){
long now = System.currentTimeMillis();
timeView.setText(FormatUtility.relativeTime(now, content.getCreate()));
timeView.setVisibility(View.VISIBLE);
}
TextView descView = (TextView) view.findViewById(R.id.desc);
if(descView != null){
descView.setText(content.getDesc());
descView.setVisibility(View.VISIBLE);
}
}
With AQuery:
public void renderContent(Content content, View view) {
AQuery aq = new AQuery(view);
aq.id(R.id.icon).image(R.drawable.icon).visible().clicked(this, "someMethod");
aq.id(R.id.name).text(content.getPname());
aq.id(R.id.time).text(FormatUtility.relativeTime(System.currentTimeMillis(), content.getCreate())).visible();
aq.id(R.id.desc).text(content.getDesc()).visible();
}
음 전 글세요..
속도만 문제없다면 좋을거같습니다... find하는것도 시간이 걸리는걸로 아는데 .. 앞에서 저런 전처리까지하면
속도만 보장된다면 쓸테고 아니라면... 좀 그렇죠? 아마도... 액태비티가 늦게 뜰테니까여