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; } }
Fragment中添加tabs,布布扣,bubuko.com
原文:http://blog.csdn.net/zqx198810/article/details/21519093