ABOUT ME

-

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

     

    반응형

    댓글

Designed by Tistory.