예전 글들/Android

ActivityGroup를 이용한 Tab메뉴로 Tab메뉴 사라지지 않고 FrameLayout에 여러 층의 Activity 보여주기

fromleaf 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에 화면을 보여지게 해주는 것이 생각보다 저한테는 어렵더라구요. 다른 분들 자료를 참고해서 만든 소스라 많이 중복 될 수 있겠지만서도 혹시 참고하시라고요. ^^
조금더 편하게 보시려면 프로젝트 압축파일 올렸으니 다운 받아서 보세요. ^^

 

반응형