원본글>>> http://rosaria1113.blog.me/110885107

이번에 Tab을 사용해보면서 안것이지만..
안드로이드에서 tab을 사용하는 방법은 정말 많다.

Activity를 상속받고 (Tabhost - TabWidget - FrameLayout).xml을 사용하는 방법도 있고
TabActivity를 상속받아 getTabHost()를 사용하여 TabHost를 가져와서 tab을 추가하는 방법도 있다.

내가 만드는건 하나의 Tab 안에서 사용자의 동작에 따라 해줘야 할게 많을 것 같아서 Tab을 Activity로 구성하는 방법으로 해봤다.

main.xml
 <?xml version="1.0" encoding="utf-8"?>
<TabHost
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tabHost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">   
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">       
        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"/>           
        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
        </FrameLayout>           
    </LinearLayout>
</TabHost>

xml은 위와 같이 TabHost안에 LinearLayout을 두고 그 안에 TabWidget과 하부 화면을 담당할 FrameLayout을 넣었다.

ImageEditorMainActivity.java
 package com.ronze.imageeditor;

import android.app.ActivityGroup;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TabHost;

public class ImageEditorMainActivity extends ActivityGroup {
    
    private TabHost tabHost;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        tabHost = (TabHost)findViewById(R.id.tabHost);
        
        // TabHost 를 findViewById 로 생성한 후 Tab 추가 전에 꼭 실행
        tabHost.setup(getLocalActivityManager());
        
        tabHost.addTab(tabHost.newTabSpec("Tab_RESIZE")
                .setIndicator(getString(R.string.str_tab_resize))        
                .setContent(new Intent(this, ResizeActivity.class)));
        
        tabHost.addTab(tabHost.newTabSpec("Tab_ROTATE")
                .setIndicator(getString(R.string.str_tab_rotate))        
                .setContent(new Intent(this, RotateActivity.class)));           
        
        tabHost.addTab(tabHost.newTabSpec("Tab_WATERMARK")
                .setIndicator(getString(R.string.str_tab_watermark))        
                .setContent(new Intent(this, WatermarkActivity.class)));        
    }
}

Tab 추가 전에 tabHost.setup()을 해야 한다.
만약 activity 호출을 위한 intent를 content로 설정하기 위해서는
tabHost.setup() 대신 tabHost.setup(getLocalActivityManager())을 해야 한다.

그런데 Actvity를 extends 한 경우에는 getLocalActivityManager()가 없다.
왜냐하면
TabActivity extends ActivityGroup extends Activity 이고, getLocalActivityManager()는 ActivityGroup class에 있는 메소드이 이기 때문이다.

따라서 위와 같이 extends ActivityGroup을 해주고 setup을 진행해 줘야 한다.



사실 위 스크린샷과 같이 화면 구성을 할거면 extends TabActivity 를 하여 간단하게 구현할 수 있다.
내가 이리 삽질을 한것은 tab은 하단으로, 화면은 Activity로 구성하고 싶어서다.

main.xml
 <?xml version="1.0" encoding="utf-8"?>
<TabHost
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tabHost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
            
        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1">
        </FrameLayout>
        
        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"/>
            
    </LinearLayout>
</TabHost>


Posted by 커널제로

본 블로그는 페이스북 댓글을 지원합니다.

,