ActionBarSherlock를 이용한 탭 내비게이션
바로 아래 글에 이어 ActionBarSherlock를 이용한 탭 내비게이션 프로그램을 만들어보자.
탭을 3개로 했을 때 필요한 소스 파일은 총 5개.
- 메인 액티비티
- 탭 리스너
- 댑1 처리 소스
- 탭2 처리 소스
- 탭3 처리 소스
- 기타 리소스 파일
package com.spacesoft.myactionbartab; import android.os.Bundle; import android.widget.Toast; import com.actionbarsherlock.app.ActionBar; import com.actionbarsherlock.app.SherlockFragmentActivity; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuItem; public class MainActivity extends SherlockFragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { setTheme(R.style.Theme_Sherlock); //Used for theme switching in samples super.onCreate(savedInstanceState); ActionBar actionBar = getSupportActionBar(); actionBar.setTitle("ActionBar TAB"); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); actionBar.addTab(actionBar .newTab() .setText("처음탭") .setTabListener(new TabListener<MyTab1>(this, "tab1", MyTab1.class))); actionBar.addTab(actionBar .newTab() .setText("탭2") .setTabListener(new TabListener<MyTab2>(this, "tab2", MyTab2.class))); actionBar.addTab(actionBar .newTab() .setText("3번탭") .setTabListener(new TabListener<MyTab3>(this, "tab3", MyTab3.class))); if (savedInstanceState != null) { actionBar.setSelectedNavigationItem(savedInstanceState.getInt( "selectedTab", 0)); } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt("selectedTab", getSupportActionBar() .getSelectedNavigationIndex()); } @Override public boolean onCreateOptionsMenu(Menu menu) { //Used to put dark icons on light action bar menu.add("search") .setIcon(R.drawable.icon_search) .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); menu.add("Settings") .setIcon(R.drawable.icon_settings) .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { Toast.makeText(this, "Selected Item : " + item.getTitle(), Toast.LENGTH_SHORT).show(); return true; } }
package com.spacesoft.myactionbartab; import android.support.v4.app.FragmentTransaction; import com.actionbarsherlock.app.ActionBar.Tab; import com.actionbarsherlock.app.SherlockFragment; import com.actionbarsherlock.app.SherlockFragmentActivity; public class TabListener<T extends SherlockFragment> implements com.actionbarsherlock.app.ActionBar.TabListener { private final SherlockFragmentActivity mActivity; private final String mTag; private final Class<T> mClass; private SherlockFragment mFragment; public TabListener(SherlockFragmentActivity activity, String tag, Class<T> clz) { mActivity = activity; mTag = tag; mClass = clz; } public void onTabSelected(Tab tab, FragmentTransaction ft) { SherlockFragment preInitializedFragment = (SherlockFragment) mActivity.getSupportFragmentManager().findFragmentByTag(mTag); if (preInitializedFragment == null) { mFragment = (SherlockFragment) SherlockFragment.instantiate(mActivity, mClass.getName()); ft.add(android.R.id.content, mFragment, mTag); } else { ft.attach(preInitializedFragment); } } public void onTabUnselected(Tab tab, FragmentTransaction ft) { SherlockFragment preInitializedFragment = (SherlockFragment) mActivity.getSupportFragmentManager().findFragmentByTag(mTag); if (preInitializedFragment != null) { ft.detach(preInitializedFragment); } else if (mFragment != null) { ft.detach(mFragment); } } public void onTabReselected(Tab tab, FragmentTransaction ft) { // User selected the already selected tab. Usually do nothing. } }
package com.spacesoft.myactionbartab; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.actionbarsherlock.app.SherlockFragment; public class MyTab1 extends SherlockFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.simple, container, false); View tv = v.findViewById(R.id.text); ((TextView) tv).setText("1번 탭이다."); return v; } }
package com.spacesoft.myactionbartab; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.actionbarsherlock.app.SherlockFragment; public class MyTab2 extends SherlockFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.simple, container, false); View tv = v.findViewById(R.id.text); ((TextView) tv).setText("여기는 두 번째 탭"); return v; } }
package com.spacesoft.myactionbartab; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.actionbarsherlock.app.SherlockFragment; public class MyTab3 extends SherlockFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.simple, container, false); View tv = v.findViewById(R.id.text); ((TextView) tv).setText("tab3에 왔다."); return v; } }
각 파일을 위와 같이 준비하고 필요한 리소스 파일(각 탭에 텍스트를 출력하기 위한 레이아웃 파일 – simple.xml – 과 아이콘 부분에 들어갈 아이콘으로 icon_search.png와 icon_settings.png가 필요하다)을 적당한 폴더에 넣고 실행하면 아래 화면과 같이 탭으로 구분된 실행화면이 나타난다.
