IT_Programming/Android_Java

[펌] 안드로이드 뷰 캡슐화 전략 - TabView ( TabHost )

JJun ™ 2012. 3. 7. 17:51

-----------------------------------------------------------------------------------------------

 출처: 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 있다면 레이아웃을 추가하지 않아도 에러가 나지 않습니다.


레이아웃 분리에 관해서는 ( 안드로이드 캡슐화 전략 - 레이아웃 분리하여 관리하기 ) 참조하시면 

되겠습니다.