-
ActivityGroup를 이용한 Tab메뉴로 Tab메뉴 사라지지 않고 FrameLayout에 여러 층의 Activity 보여주기예전 글들/Android 2011. 7. 14. 19:42반응형위의 제목이 맞는지 모르겠지만 구조는 아래의 그림과 같습니다.
참 별거 아닌데 고생 좀 했습니다. 에효....
우선 프로젝트 구조는 이렇습니다.
뭐 그렇게 중요한 건 아니지만 그래도 혹시 모르닌까요.
tabhost_main.xml 파일 소스는 아래와 같습니다. 옆 그림때문에 조금 짤리겠지만 복사해서 보시면 될꺼예요.
<?xml version="1.0" encoding="utf-8"?>
<TabHost
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@android:id/tabhost">
<LinearLayout
android:id="@+id/LinearLayout01"
android:orientation="vertical"
android:layout_height="fill_parent"
android:layout_width="fill_parent">
<!-- 아래의 TabWidget을 FrameLayout의 아래에 입력한 경우
화면상의 TabWidget도 아래에 위치하게 됩니다. -->
<TabWidget
android:id="@android:id/tabs"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:orientation="horizontal">
</TabWidget>
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_height="0dip"
android:layout_width="fill_parent"
android:layout_weight="1">
</FrameLayout>
</LinearLayout>
</TabHost>
TabHostExampleActivity.class 소스입니다.
package youn.exam.TabHost;import android.app.TabActivity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TabHost;public class TabHostExampleActivity extends TabActivity {
/** Called when the activity is first created. */
public TabHost tabHost = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tabhost_main);
tabHost = (TabHost) findViewById(android.R.id.tabhost);
// Tab을 추가하고 싶은 경우 아래와 같이 추가하시면 됩니다.
// 물론, Tab에 관한 속성도 설정할 수 있으니
// 그건 Android Developer 사이트를 참고하세요.
tabHost.addTab(tabHost.newTabSpec("tab1")
.setIndicator("FirstTab")
.setContent(new Intent(this, TabHost_FirstTab.class)));
tabHost.addTab(tabHost.newTabSpec("tab2")
.setIndicator("SecondTab")
.setContent(new Intent(this, TabHost_SecondTab.class)));
tabHost.addTab(tabHost.newTabSpec("tab3")
.setIndicator("ThirdTab")
.setContent(new Intent(this, TabHost_ThirdTab.class)));
tabHost.setCurrentTab(0);
}
}
TabHost_FirstTab.class 소스입니다.
package youn.exam.TabHost;import java.util.ArrayList;
import android.app.ActivityGroup;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;public class TabHost_FirstTab extends ActivityGroup {
public static TabHost_FirstTab FirstTabHGroup;
private ArrayList<View> history;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
history = new ArrayList<View>();
FirstTabHGroup = this;
Intent intent = new Intent(TabHost_FirstTab.this, FirstTab_1.class);
View view = getLocalActivityManager().startActivity("FirstTab_1", intent
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView();
replaceView(view);
}
// 새로운 Level의 Activity를 추가하는 경우
public void replaceView(View view) {
history.add(view);
setContentView(view);
}
// Back Key가 눌러졌을 경우에 대한 처리
public void back() {
if(history.size() > 0) {
history.remove(history.size()-1);
if(history.size() == 0)
finish();
else
setContentView(history.get(history.size()-1));
}
else
{
finish();
}
}
// Back Key에 대한 Event Handler
@Override
public void onBackPressed() {
FirstTabHGroup.back();
return ;
}
}
소스에 관한 설명은 주석 처리해 놓은 것을 그대로 보시면 될겁니다. 그렇게 어려운 소스가 아니니 안드로이드 어느 정도 공부하신 분이라면 쉽게 이해가실꺼예요.
FirstTab_1.class 소스입니다.
package youn.exam.TabHost;import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;public class FirstTab_1 extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.firsttab_1_layout);
final Button btn_next = (Button)findViewById(R.id.btn_firsttab1_nextbutton);
btn_next.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Intent intent = new Intent(FirstTab_1.this, FirstTab_2.class);
view = TabHost_FirstTab.FirstTabHGroup.getLocalActivityManager()
.startActivity("FirstTab_2", intent
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView();
TabHost_FirstTab.FirstTabHGroup.replaceView(view);
}
});
}
}
마지막으로 FirstTab_2.class 소스 입니다. 그렇게 중요한 건 아니지만 onBackPressed() 함수가 중요하거든요.
package youn.exam.TabHost;import android.app.Activity;
import android.os.Bundle;public class FirstTab_2 extends Activity{
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.firsttab_2_layout);
}
@Override
public void onBackPressed() {
TabHost_FirstTab parent = ((TabHost_FirstTab)getParent());
parent.onBackPressed();
}
}
Tab메뉴를 구성하시려는 분들은 위 소스 참고하시면 될 겁니다. 위의 TabWidget이 사라지지 않고 그 아래 FrameLayout에 화면을 보여지게 해주는 것이 생각보다 저한테는 어렵더라구요. 다른 분들 자료를 참고해서 만든 소스라 많이 중복 될 수 있겠지만서도 혹시 참고하시라고요. ^^
조금더 편하게 보시려면 프로젝트 압축파일 올렸으니 다운 받아서 보세요. ^^
반응형'예전 글들 > Android' 카테고리의 다른 글
아래 동영상 보며 정리한 것들임돠~ (0) 2011.07.21 GWT 시작하기 UTube에 올라와있는 동영상 강의 (0) 2011.07.19 Layout 혹은 R 파일에 저장된 컴포넌트 소스에서 못 불러오는 경우(에러 메시지: cannot be resolved or is not a field) (0) 2011.06.24 XmlPullParser를 이용한 파싱방법 (0) 2011.06.22 Context 객체 (0) 2011.05.19 댓글