안드로이드 개발 질문/답변
(글 수 45,052)
보통 아마 TabHost 사용시 Frame layout에 하나의 Activity를 가지는걸로 알고 있습니다.
헌데 저는 하나의 탭안에 ListView를 넣고 이 Listview에 리스너를 장착하여 해당 아이템에 대한 정보를
다시 TabHost는 유지한체로 Frame layout의 View를 다른 Activity로 바꿀수 있고 다시 이전의 ListActivity가 살이있어서 뒤로가기 기능도 가능하면 최상이겠지만.
실상은 하나의 Frame Layout안에 여러개의 Activity를 사용할수 없기때문에 setContentView를 이용해서 Activity는 그대로인데
View만을 바꾸어서 상태값을 직접 넘겨주는 방법을 사용하는것 같군요
제가 개발자 정보게시판의 LocalActivityManager에 관한 글도 읽어보았는데 코드를 실제로 훌터보니 기본개념은 setContentView를 이용하여 View만 바꿀뿐 솔직히 Manager를 사용하지 않아도 구현할수 있는 내용이더군요(살짝봐서 이해를 잘 못했거나 아닐수도 ...)
사실 제가 Activity를 TabHost를 유지하면서 intent하고 다시 뒤로 올수 없다는 사실을 안 후부터 이미 contentview를 이용하여 직접 아이템값을 넘겨주면서 새로운 View를 만들고 Back()함수를 재 정의하여 다시 listview가 나올수 있도록 구현은 하였습니다 물론 tabHost는 유지됩니다.
헌데 이러한 일이 실로 안타까운일이 아닐수가 없습니다. 만약에 Frame Layout안에서 여러개의 Activity가 서로 통신하며 여러개로 구성될수 있다면 TabActivity안에 FrameLayout안에 또다른 Activity들이 intent하여 점점 stop되는 activity가 쌓이게되고 이렇게되면 엄청난 자원낭비가 아닐수가 없습니다.
tab자체만으로도 상당히 무거워 지는데 여기에 intent를 통해 activity생명이 꺼지지않고 계속 살아있게 된다면 tab이 5개인경우 각각 activity가 5개라고 치고 모두 intent하여 마지막 activity까지 들어갔다면..
각 tab에는 5개의 activity가 살아있습니다. 그것도 TabActivity안에.. 그래서 TabActivity에서 intent의 사용을 허락하지 않는거 일수도 잇겠다고 생각은 하였으나 실로 listview를 이용한 activity의 넘겨주고 받음의 경우 한두개정도의 Activity는 어쩔수없다고 생각되며 오히려 UI면에서는 상당한 편리함을 추구한다고 생각되네요..
제가 초보라서 이 모든사실이 아닐수도 있습니다. 제가 나름대로 그냥 여러곳에서 보고 분석하고 해본결과 이런 결과가 나왔는데..
여러분의 도움이 필요합니다
Help Me TT
2011.03.15 11:35:46
우선 Intent의 flag를 찾아보시고 적용 해보세요.
그리고 생명 주기를 잘 잡으셔서 메모리 초기화도 잘해주시고요.
흠...LocalActivityManager로 나온 많은 예제를 보면 파악하신것 처럼 View를 바꾸는건데요.
위에서 말씀하신 ListActivity가 살이있어서 뒤로가기 기능도 가능하면 최상이겠지만. 이것이 가능해집니다.
소스를 잘보세요 뷰를 담아 두었다가 이전 뷰로 바꾸어서 세팅하게 되있습니다.
사용하다보면 데이터 넘기는 이슈와 리턴값에 대한 이슈가 종종 생기지만 google에서 찾아보면 잘나와있습니다.
도움이 되실런지;;
2011.03.15 21:36:24
흠....우선 말씀드리고 싶은것은
TabHost는 유지한체로 Frame layout의 View를 다른 Activity로 바꿀수 있고 다시 이전의 ListActivity가 살이있어서 뒤로가기 기능
이게 가능하게 하려고 많이들 사용합니다.(탭안에서 아이폰의 뒤로가기 같은 효과)
Jood님이 어떤 자료를 보셨는지는 짐작이 가는네요.
http://www.androidpub.com/?mid=android_dev_info&search_target=title_content&search_keyword=local&document_srl=899711
이 링크를 보신거 같은데요.
Jood님이 원하시는게 처음에 언급했던 효과 (뒤로가기 관리)이면 한번 간단하게 코딩하시면 알수 있으실겁니다.
원론적으로 설명은 제가 지식이 짧아 글로 쓰기는 부족하네요.
참고로 저도 뒤로가기를 제어하려고 하다 Jood님과 같이 setContentsView를 다시 그려 사용하다 찾아낸 방법입니다.
그리고 제가 글을 자세히 못봐서 그런건데 탭이 5개 그리고 각각의 탭안에 5개씩의 Activity를 가지고 있다는거 같은데
우선 1번탭을 실행 하고 다섯번 들어가고 2번탭을 실행하고 다섯번 들어가고 이런식으로 5x5의 Activity라면 우선 정책적으로
정하셔야합니다. 쌓다보면 메모리 관리가 거의 불가능해지기 때문입니다.
그래서 Intent의 Flag를 사용하시라고 말씀드린겁니다.
예를 들어 새로운 탭을 누를때 기존 봤던 탭안의 Activity를 날려 그탭의 첫 Activity를 보여주는 방식으로 메모리 관리를 하실 수도 있습니다.
2011.03.16 00:00:53
intent Flag를 사용하면 메모리면에선 상당히 좋은효과가 있지만 Activity가 날아간다는 것 때문에.. 패쓰하였네요.. 되도록이면 살려두고싶어서요^^;
뒤로가기효과는 제가 다시금 ContentViewChanged리스너? 였나.. view가바뀔때 리스너가 존재해서 이 메소드를 이용해서 상태값을 만들어서 뒤로가기를 구현하였답니다.. 물론 앞으로가나 뒤로가나 view는 계속 바뀌는형식으로요.. activity는 그대로..
대신 view가 바뀔때 필요한 정보를 날릴수 있도록 하였답니다..
tab부분에서 안드로이드가 상당히 약한모습을 보이는게 아쉽네요..tab이 상당히 중요한 부분임에도 말이죠..
쨋든 꼬룡님 덕분에 많이 배우고갑니다!! 갑사합니다 ㅎㅎ



