-----------------------------------------------------------------------------------------------
출처: http://blog.danggun.net/419
하기 싫지만... 중요한 UI 관리... -_-;
좋은 글이 있어서 퍼왔습니다.
-----------------------------------------------------------------------------------------------
안드로이드 캡슐화의 정점이라고 생각하는 탭뷰입니다.
탭뷰는 아무래도 여러개의 레이아웃이 한곳에 있기때문에 사용할때 복잡 할수가 있저. 중복코드도 많고요.
그래서 레이아웃 분리가 필요합니다.
|
1. 탭뷰 클래스 |
claTabHost.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
import android.content.Context; import android.graphics.drawable.Drawable; import android.view.LayoutInflater; import android.widget.TabHost;
/** * claTabHost * * @author DangGun Roleeyas ( http://bolg.danggun.net/) * @version 1.0 ( 2010.11.28 ) * * 탭 호스트 * * 이 클래스는 그대로 사용하지 말고 복사해서 사용해야 합니다. * 이 클래스는 뷰들의 세팅작업을 한번에 완료하고 제어하는데 목적이 있습니다. * * 클래스 자체적으로 뷰객체를 저장하고 있으므로 외부에서는 이 클래스의 객체만 생성해서 사용하세요. * GetOvject() 메소드를 통해 저장되있는 객체에 직접 접근 할수 있습니다. * * 복사한후 자신이 사용하려는 동작을 할수 있게 직접 수정하셔야 합니다. * 이 클래스의 내용은 참고용으로 사용 하시기 바랍니다. * * 메인 레이아웃에만 탭으로쓸 레이아웃이 존재한다면 객체 생성후 AddTab()를 호출하여 레이아웃을 탭컨탠츠로 사용하실 수 있습니다. * 메인 레이아웃 이외의 레이아웃을 사용하시려면 AddLayout()으로 해당 래이아웃을 추가한후 탭을 추가하셔야 에러가 발생하지 않습니다. * * 탭 호스트가 작동하기 위해서는 메인레이아웃에 TabHost, TabWidget 가 꼭있어야 합니다.(일반 탭 생성과 동일 합니다.) */ public class claTabHost { Context context; TabHost tabHost;
/** * 생성자 * * 탭 호스트를 저장하고 * * 연결할 데이터를 미리 설정해놓는 방식은 데이터를 정적일때 사용합니다.연결할 데이터 * * @param context 나를 소유하고 있는 액티비티 * @param tabHost 이 클래스 내에 탭호스트 객체가 저장되므로 객체를 따로 저장 하실 필요는 * 없습니다. */ public claTabHost(Context context, TabHost tabHost) { this.context = context; this.tabHost = tabHost;
// findViewById를 이용해 TabHost인스턴스를 얻은경우 꼭 호출 필요 this.tabHost.setup();
}
/** * 내가 소유하고있는 뷰를 리턴한다. * * @return 이 클래스가 소유하고 있는 객체를 리턴합니다. */ public TabHost GetOvject() { return this.tabHost; }
/** * 레이아웃을 추가합니다. * * @param resource 추가할 레이아웃 리소스번호 */ public void AddLayout( int resource) { LayoutInflater.from(context).inflate(resource, tabHost.getTabContentView(), true); }
/** * 탭을 추가한다. * * @param strID 추가할 탭의 아이디 * @param strTitle 추가할 탭의 제목 * @param intTabIcon 추가할 탭에 넣을 아이콘. -1을 넣으면 사용 안함입니다. * @param intContentViewId 추가할 탭에 넣을 컨텐츠의 레이아웃아이디 */ public void AddTab(String strID, String strTitle, int intTabIcon , int intContentViewId) { // Tab builder 객체생성 TabHost.TabSpec spec;
// Tab 세팅 spec = tabHost.newTabSpec(strID); // Tab Builder 객체 생성
// 아이콘 등록 Drawable drawTabIcon;
// 아이콘 정보가 안들어 왔는지? if(intTabIcon < 0) { // 안들어왔으면 널처리 drawTabIcon = null; } else { // 들어왔으면 아이콘을 부른다. drawTabIcon = this.context.getResources().getDrawable(intTabIcon); }
// 제목 spec.setIndicator(strTitle, drawTabIcon); // Tab 내용 spec.setContent(intContentViewId); // Tab 등록 tabHost.addTab(spec);
} } |
|
2. 테스트용 레이아웃 |
테스트해볼라면 레이아웃이 필요하지 않겠습니까?
총 3개의 탭을 만들어 보겠습니다.
|
2-1. 메인레이아웃 |
|
2-2. 탭 컨텐츠 레이아웃 |
tab_1.xml
tab_2.xml
tab_3.xml
| 3. 사용 방법 |
1 2 3 4 5 6 7 8 9 10 11 12 |
// 탭호스트 생성 claTabHost thMain = new claTabHost(this, (TabHost)findViewById(R.id.TabHost));
// 레이아웃 추가 thMain.AddLayout(R.layout.tab_1); thMain.AddLayout(R.layout.tab_2); thMain.AddLayout(R.layout.tab_3);
// 탭추가 thMain.AddTab("tab1", "탭1",-1, R.id.tab1); thMain.AddTab("tab3", "탭2", -1, R.id.tab2); thMain.AddTab("tab2", "탭3", -1, R.id.tab3); |
코드를 보면 생성한 .xml파일을 R.layout으로 불러 오는 것을 알수있습니다.
레이아웃을 먼저 불러와야 그 레이아웃에 있는 레이아웃을 불러올때 에러가 나지 않습니다.
만약 모든 레이아웃이 main.xml에 있다면 레이아웃을 추가하지 않아도 에러가 나지 않습니다.
레이아웃 분리에 관해서는 전 글( 안드로이드 뷰 캡슐화 전략 - 레이아웃 분리하여 관리하기 )을 참조하시면
되겠습니다.
'IT_Programming > Android_Java' 카테고리의 다른 글
Android Thread Constructs: Comparisons (0) | 2012.03.12 |
---|---|
Android ListView 안에 있는 여러 개의 Button 처리 (0) | 2012.03.08 |
Android's Application Object as a "Singleton" (0) | 2012.03.06 |
[펌] 안드로이드 전역 변수 사용하기! (android global variable) (0) | 2012.03.06 |
[펌] How to quit an application in Android (0) | 2012.03.06 |