프로그래밍/안드로이드

안드로이드 - 내비게이션 탭(Navigation Tab)

가카리 2015. 10. 4. 21:12
반응형

 

TabActivity가 deprecated됨에 따라 이제 탭을 위해서는 다음의 방법을 써야한다.

참고 내용 : http://limts28.tistory.com/458

 

액션탭을 사용하려면 다음 메소드로 네비게이션탭으로 변경해야한다.

 

    void setNavigationMode(int mode)

    int getNavigationMode()

 

모드

설명

NAVIGATION_MODE_STANDARD

로고 아이콘과 액션 항목이 배치된다.

NAVIGATION_MODE_TABS

액션바에 여러 개의 탭을 배치하려 페이지를 전환한다.

NAVIGATION_MODE_LIST

드롭다운 리스트로 페이지를 전환한다.

 

 

액션바의 다음 메소드로 탭을 추가 삭제한다.

    ActionBar.Tab newTab()

    void addTab(ActionBar.Tab tab, [int position, boolean setSelected])

    void removeTab(ActionBar.Tab tab)

    void removeTabAt(int position)

    void removeAllTabs()

 

newTab 메소드로 새로운 빈탭을 생성하고 addTab으로 액션바에 탭을 추가한다.

position 인수로 추가할 위치를 지정하여 중간에 삽입할 수도 있고 setSelected 인수를 true로 하여 추가 후 바로 선택할 수도 있다.

removeTab은 특정 위치의 탭을 제거, removeAllTabs는 전체 탭을 제거하여 비운다.

 

    ActionBar.Tab setText(int resId)

    ActionBar.Tab setText(CharSequence text)

    ActionBar.Tab setIcon(int resId)

    ActionBar.Tab setCustomView(int layoutResId)

    ActionBar.Tab setCustomView(View view)

    ActionBar.Tab setTag(Object obj)

    ActionBar.Tab setTabListener(ActionBar.TabListener listener)

 

탭에 캡션 , 아이콘, 커스텀뷰를 배치하기위해 위의 메소드를 사용한다.

 

    void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft)

    void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft)

    void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft)

 

탭이 선택, 선택 해제, 재선택 될 때 위의 메소드가 호출된다.

 

    int getTabCount()

    void selectTab(ActionBar.Tab tab)

    ActionBar.Tab getSelectedTab()

    ActionBar.Tab getTabAt(int index)

    void setSelectedNavigationItem(int position)

    int getSelectedNavigationIndex()

 

위의 메소드는 탭을 위한 관리 메소드이다.

 

다음 예제는 프래그먼트를 이용해서 탭을 만든다.

 

 

 

res/layout/activity_action_tab.xml

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

>

 

<TextView

android:id="@+id/content"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="" />

 

</LinearLayout>

 

res/layout/actiontab.xml

 

<?xml version="1.0" encoding="utf-8"?>

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:id="@+id/tabparent"

android:layout_width="match_parent"

android:layout_height="match_parent"

    >

 

</FrameLayout>

 

src/ActionTab.java

 

package com.example.actiontab;

 

import android.app.ActionBar;

import android.app.ActionBar.Tab;

import android.app.Activity;

import android.app.Fragment;

import android.app.FragmentTransaction;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.TextView;

 

public class ActionTab extends Activity {

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.actiontab);

      

        ActionBar ab = getActionBar();

        ab.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        

        //여기서 탭을 3 만들어준다.

        for(int i=0; i < 3; i++){

            ActionBar.Tab tab = ab.newTab();

            String Cap = "Tab" + (i + 1);

            tab.setText(Cap);

            

            //여기서는 번들에 값이 들어가 있음

            TabFragment frag = TabFragment.newInstance(Cap);

            tab.setTabListener(new TabListener(frag));//리스너 등록

            ab.addTab(tab);

        }

        

        //화면의 방향이 바껴도 탭의 선택위치가 안바뀌게 하기위해서

        if(savedInstanceState != null){

            int seltab = savedInstanceState.getInt("seltab");

            ab.setSelectedNavigationItem(seltab);

        }

 

    }

      

        //화면의 상태 전환시 현재 상태를 저장하기 위한 메소드 오버라이딩

        public void onSaveInstanceState(Bundle outState){

            super.onSaveInstanceState(outState);

            outState.putInt("seltab", getActionBar().getSelectedNavigationIndex());

        }

        

        private class TabListener implements ActionBar.TabListener{

            private Fragment mFragment;

            

            public TabListener(Fragment fragment){

                mFragment = fragment;

            }

            

            @Override

            public void onTabReselected(Tab tab, FragmentTransaction ft) {

                // TODO Auto-generated method stub

                

            }

 

            @Override

            public void onTabSelected(Tab tab, FragmentTransaction ft) {

                // TODO Auto-generated method stub

                //탭이 선택되면 프래그먼트를 추가한다.

                ft.add(R.id.tabparent, mFragment, "tag");

            }

 

            @Override

            public void onTabUnselected(Tab tab, FragmentTransaction ft) {

                // TODO Auto-generated method stub

                ft.remove(mFragment);

            }

            

        }

        

        public static class TabFragment extends Fragment{

            

            public static TabFragment newInstance(String text){

                TabFragment frag = new TabFragment();

                

                //번들에 넣어줌

                //프래그먼트끼리 송수신은 번들을 이용한다.

                Bundle args = new Bundle();

                args.putString("text", text);//text태그에 text라는 값을 넣는다.

                frag.setArguments(args);

                

                return frag;//반환함.

            }

            

            //프래그먼트 뷰를 생성

            public View onCreateView(LayoutInflater inflater, ViewGroup container,

                        Bundle savedInstanceState){

            //여기서 프래그먼트 UI 그릴때 호출한다.

         //그래서 여기에서 XML 가져와서 UI 만들어준다.

                

                String text = "";

                //프래그먼트끼리 데이터 송수신시에는 반드시 번들을 사용해야한다.

                Bundle args = getArguments();

                if(args != null){

                    text = args.getString("text");

                }

                

                //여기서 전개자를 이용해서 UI 만드는 부분

                View linear = inflater.inflate(R.layout.activity_action_tab, container, false);

                TextView textview = (TextView)linear.findViewById(R.id.content);

                textview.setText(text);

                

                return linear;

            }

        }

        

}

 

실행 화면

다음과 같이 탭이 3개 생성된다.