Fragment中添加tabs

package com.example.drawernavigation.fragment;

import java.lang.reflect.Method;

import com.example.drawernavigation.R;

import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTabHost;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar.Tab;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * 第一个抽屉中有几个tab 选择在此fragment中新建tabs而不是在外面
 * 
 * @author qingxiangzhang
 * 
 */
public class AFragmentDrawer extends Fragment {

	private static final String TAG = "AFragmentDrawer";
	static int contentViewCompat;
	private ActionBar actionBar;
	private FragmentTabHost mTabHost;
	
	
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {

		Log.e(TAG, "onCreateView");

//		View view = inflater.inflate(R.layout.fragment_a, container, false);
//
//		contentViewCompat = getContentViewCompat();
//
//		actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

		return mTabHost;
	}

	@Override
	public void onAttach(Activity activity) {
		super.onAttach(activity);
		Log.e(TAG, "onAttach");

		ActionBarActivity activity2 = (ActionBarActivity) activity;
		actionBar = activity2.getSupportActionBar();


		
		
//		mTabHost = new FragmentTabHost(activity2);
//		mTabHost.setup(getActivity(),getChildFragmentManager(),R.id.content_frame);
//		
//		mTabHost.addTab(mTabHost.newTabSpec("task").setIndicator("任务"),TaskFragmentTab.class,null);
//		mTabHost.addTab(mTabHost.newTabSpec("tour").setIndicator("巡视"),TourFragmentTab.class,null);
//		mTabHost.addTab(mTabHost.newTabSpec("event").setIndicator("事件"),EventGeneralFragmentTab.class,null);
//		mTabHost.addTab(mTabHost.newTabSpec("contacts").setIndicator("通讯录"),ContactsFragmentTab.class,null);

		actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
		actionBar.removeAllTabs();
		/**
		 * 增加第一个tab ---task
		 */
		Tab tab = actionBar
				.newTab()
				.setText(R.string.fragment_task)
				.setTabListener(
						new TabListener<TaskFragmentTab>(activity, "task",
								TaskFragmentTab.class));
		actionBar.addTab(tab);

		/**
		 * 增加第二个tab ---tour
		 */
		tab = actionBar
				.newTab()
				.setText(R.string.fragment_tour)
				.setTabListener(
						new TabListener<TourFragmentTab>(activity, "tour",
								TourFragmentTab.class));
		actionBar.addTab(tab);
		/**
		 * 增加第三个tab ---event
		 */
		tab = actionBar
				.newTab()
				.setText(R.string.fragment_event)
				.setTabListener(
						new TabListener<EventGeneralFragmentTab>(activity,
								"event", EventGeneralFragmentTab.class));
		actionBar.addTab(tab);

		/**
		 * 增加第四个tab ---contact
		 */
		tab = actionBar
				.newTab()
				.setText(R.string.fragment_contact)
				.setTabListener(
						new TabListener<ContactsFragmentTab>(activity,
								"contact", ContactsFragmentTab.class));
		actionBar.addTab(tab);
	}

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		Log.e(TAG, "onCreate");

	}

	@Override
	public void onActivityCreated(Bundle savedInstanceState) {
		super.onActivityCreated(savedInstanceState);
		Log.e(TAG, "onActivityCreated");
	}

	@Override
	public void onStart() {
		super.onStart();
		Log.e(TAG, "onStart");
	}

	@Override
	public void onResume() {
		Log.e(TAG, "onResume");
		super.onResume();
	}

	@Override
	public void onPause() {
		Log.e(TAG, "onPause");
		super.onPause();
	}

	@Override
	public void onStop() {
		Log.e(TAG, "onStop");
		super.onStop();
	}

	@Override
	public void onDestroyView() {
		Log.e(TAG, "onDestroyView");
		super.onDestroyView();

//		actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
//		mTabHost.removeAllViews();
		
		((ViewGroup) mTabHost.getParent()).removeView(mTabHost);
	}

	@Override
	public void onDestroy() {
		Log.e(TAG, "onDestroy");
		super.onDestroy();

	}

	@Override
	public void onDetach() {
		Log.e(TAG, "onDetach");
		super.onDetach();
	}

	/**
	 * tab 监听器,处理 fragment之间的 attach, detach, show, hide,add, remove
	 * 
	 * @author qingxiangzhang
	 * 
	 * @param <T>
	 */
	public static class TabListener<T extends Fragment> implements
			ActionBar.TabListener {
		private Fragment mFragment;
		private final Activity mActivity;
		private final String mTag;
		private final Class<T> mClass;

		/**
		 * Constructor used each time a new tab is created.
		 * 
		 * @param activity
		 *            The host Activity, used to instantiate the fragment
		 * @param tag
		 *            The identifier tag for the fragment
		 * @param clz
		 *            The fragment's Class, used to instantiate the fragment
		 */
		public TabListener(Activity activity, String tag, Class<T> clz) {
			mActivity = activity;
			mTag = tag;
			mClass = clz;
			Log.e(TAG, mClass.getName() + "TabListener");
		}

		/* The following are each of the ActionBar.TabListener callbacks */

		@Override
		public void onTabReselected(Tab tab, FragmentTransaction ft) {
			Log.e(TAG, mFragment.getTag() + "onTabReselected");
		}

		@Override
		public void onTabSelected(Tab tab, FragmentTransaction ft) {
			// 检测是否fragment已经被初始化
			if (mFragment == null) {
				// 如果没有,初始化并且将这个fragment增加到activity
				mFragment = Fragment.instantiate(mActivity, mClass.getName());
				ft.add(contentViewCompat, mFragment, mTag); // 注 此处存在一个BUG,具体见有道
															// 文档
			} else {
				// 如果存在,只要简单的attach它用于将其显示出来
				// ft.attach(mFragment);
				ft.show(mFragment);
				Log.e(TAG, "展示了 " + mTag + " fragment");
			}

			Log.e(TAG, mFragment.getTag() + " onTabSelected");

		}

		@Override
		public void onTabUnselected(Tab tab, FragmentTransaction ft) {
			if (mFragment != null) {
				// detach 这个fragment,因为其他的fragment正在被attach
				// ft.detach(mFragment);
				ft.hide(mFragment);
				// ft.remove(mFragment);
				Log.e(TAG, mFragment.getTag() + " onTabUnselected");
			}

			/**
			 * 因为源码中存在bug, 此方法中的ft并没有执行 需要加入下列代码
			 */
			if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
				try {
					Method commit = tab.getClass().getDeclaredMethod(
							"commitActiveTransaction");
					commit.setAccessible(true);
					commit.invoke(tab);

				} catch (RuntimeException e) {
					throw e;

				} catch (Exception e) {
					throw new RuntimeException(e);
				}
			}

		}
	}

	public int getContentViewCompat() {
		return Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH ? android.R.id.content
				: R.id.action_bar_activity_content;
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值