Android Fragment Base

public class FragmentTabsActivity extends FragmentActivity implements OnClickListener {



    //定义FragmentTabHost对象

    private SaveFragmentTabHost mTabHost;

    //定义数组来存放Fragment界面

    private final Class[] fragmentArray = { A.class, B.class, C.class, D.class, E.class,

            F.class, G.class, H.class, I.class };

    //定义数组来存放按钮图片

    private int mIconFontArray[] = { R.string.A, R.string.B, R.string.C, R.string.D, R.string.E };

    private int mIconSelectArray[] = { R.string.AA, R.string.BB, R.string.CC, R.string.DD,

            R.string.EE};

    //Tab选项卡的文字

    private long keyNum;



    private LinearLayout tabsParent;

    private MenuDialog menuDialog;



    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        initViews();

        keyNum = 0;

    }



    /**

     * 在这里获取到每个需要用到的控件的实例,并给它们设置好必要的点击事件。

     */

    private void initViews() {

        //实例化布局对象

        // 得到fragment的个数

        int count = fragmentArray.length;

        tabsParent = (LinearLayout) findViewById(R.id.tabsParent);

        //实例化TabHost对象,得到TabHost

        mTabHost = (SaveFragmentTabHost) findViewById(android.R.id.tabhost);

        mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);



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

            // 为每一个Tab按钮设置图标、文字和内容

            String name = String.valueOf(i);

            TabSpec tabSpec = mTabHost.newTabSpec(name).setIndicator(name);

            //将Tab按钮添加进Tab选项卡中

            mTabHost.addTab(tabSpec, fragmentArray[i], null);

            //设置Tab按钮的背景

            mTabHost.getTabWidget().getChildAt(i).setBackgroundResource(R.drawable.selector_tab);

        }

mytabs = getTabHost();
mytabs.setOnTabChangedListener(new OnTabChangeListener() {
@Override
public void onTabChanged(String arg0) {
Log.i("***Selected Tab", "Im currently in tab with index::" + mytabs.getCurrentTab());
}
});



        setupTabsBar();

        menuDialog = new MenuDialog(mActivity, mTabHost);

    }



    /**

     * 给Tab按钮设置图标和文字

     */

    private LinearLayout homeLayout, celebrityLayout, brandLayout, exploreLayout, moreLayout;

    private TextView homeTv, celebrityTv, brandTv, exploreTv, moreTv;



    private void setupTabsBar() {

        homeLayout = (LinearLayout) findViewById(R.id.tabLayoutHome);

        homeLayout.setSelected(true);

        celebrityLayout = (LinearLayout) findViewById(R.id.tabLayoutCelebrity);

        brandLayout = (LinearLayout) findViewById(R.id.tabLayoutBrand);

        exploreLayout = (LinearLayout) findViewById(R.id.tabLayoutExplore);

        moreLayout = (LinearLayout) findViewById(R.id.tabLayoutMore);



        homeLayout.setOnClickListener(this);

        celebrityLayout.setOnClickListener(this);

        brandLayout.setOnClickListener(this);

        exploreLayout.setOnClickListener(this);

        moreLayout.setOnClickListener(this);



        homeTv = (TextView) findViewById(R.id.tabIconHome);

        celebrityTv = (TextView) findViewById(R.id.tabIconCelebrity);

        brandTv = (TextView) findViewById(R.id.tabIconBrand);

        exploreTv = (TextView) findViewById(R.id.tabIconExplore);

        moreTv = (TextView) findViewById(R.id.tabIconMore);

    }



    @Override

    public void onClick(View v) {

        switch (v.getId()) {

        case R.id.tabLayoutHome:

            setCurrentFragment(0);

            break;

        case R.id.tabLayoutCelebrity:

            setCurrentFragment(1);

            break;

        case R.id.tabLayoutBrand:

            setCurrentFragment(2);

            break;

        case R.id.tabLayoutExplore:

            setCurrentFragment(3);

            break;

        case R.id.tabLayoutMore:

            setCurrentFragment(4);

            menuDialog.home();

            break;

        }

    }



    private void setCurrentFragment(int index) {

        homeLayout.setSelected(index == 0);

        celebrityLayout.setSelected(index == 1);

        brandLayout.setSelected(index == 2);

        exploreLayout.setSelected(index == 3);

        moreLayout.setSelected(index == 4);



        homeTv.setText(index == 0 ? getResources().getString(mIconSelectArray[0]) : getResources().getString(mIconFontArray[0]));

        celebrityTv.setText(index == 1 ? getResources().getString(mIconSelectArray[1]) : getResources().getString(mIconFontArray[1]));

        brandTv.setText(index == 2 ? getResources().getString(mIconSelectArray[2]) : getResources().getString(mIconFontArray[2]));

        exploreTv.setText(index == 3 ? getResources().getString(mIconSelectArray[3]) : getResources().getString(mIconFontArray[3]));

        moreTv.setText(index == 4 ? getResources().getString(mIconSelectArray[4]) : getResources().getString(mIconFontArray[4]));

        if (index != 4)

            mTabHost.setCurrentTab(index);



    }



    @Override

    public boolean onKeyDown(int keyCode, KeyEvent event) {

    if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {

            if ((System.currentTimeMillis() - keyNum) > 2000) {

                Toast.makeText(mActivity, "再按一次退出", Toast.LENGTH_SHORT).show();

                keyNum = System.currentTimeMillis();

            } else {

                imageLoader.stop();

                System.exit(0);

                finish();

                android.os.Process.killProcess(android.os.Process.myPid());

            }

            return true;

        }

        return super.onKeyDown(keyCode, event);

    }



}
/**BaseActivity**/

public class Activity extends Activity implements OnClickListener {

    /**tag 用于测试log用  **/

    public String tag = this.getClass().getSimpleName();

    /**Activity**/

    protected Activity mActivity;

    /**loading**/

    protected Dialog progressDialog;

    /** 实例化ImageLoader**/

    protected ImageLoader imageLoader;

    /**显示图片设置**/

    protected DisplayImageOptions options;

    /**用户Token**/

    public String userToken;



    public ObjectMapper mapper = new ObjectMapper();



    /**翻页相关**/

    public int start = 1;

    public int refreshCnt = 1;

    public int dataStatus;



    public static final int DONE = 0;



    public static final int INITDATA = 1;



    public static final int REFRESH = 2;



    public static final int LOADDATA = 3;



    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        Log.e(tag, "onCreate------");



        mActivity = DFActivity.this;



        progressDialog = DialogUtil.createLoadingDialog(mActivity, R.string.load_data_content);



        imageLoader = ImageLoader.getInstance();

        options = new AppUtils().getOptions();



        userToken = SharedUtil.getInstance(mActivity).getString(AppConstants.JSON_USER_TOKEN);



    }



    /**

     * 按钮注册和监听事件注册

     * 注册IconFont字体

     */

    /**

     * @param title

     */

    public void initActionBar(String title) {

        TextView actionTitle = (TextView) findViewById(R.id.actionTitle);

        actionTitle.setText(title);



        Button btnBack = (Button) findViewById(R.id.actionBack);

        AppUtils.iconFont(mActivity, btnBack, 30, 0);

        btnBack.setOnClickListener(new OnClickListener() {

            @Override

            public void onClick(View v) {

                mActivity.finish();

            }

        });



        Button btnMenu = (Button) findViewById(R.id.actionMenu);

        AppUtils.iconFont(mActivity, btnMenu, 30, 0);

        btnMenu.setOnClickListener(new OnClickListener() {

            @Override

            public void onClick(View v) {

                //                mActivity.finish();

            }

        });

    }



    @Override

    public void onClick(View v) {



    }



    @Override

    public boolean onKeyDown(int keyCode, KeyEvent event) {

        if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {

            this.finish();

        }

        return super.onKeyDown(keyCode, event);

    }



    public void initFollow() {

        //        followed = mActivity.getString(R.string.btnFollowed);

        //        addFollow = mActivity.getString(R.string.btnAddFollow);



    }



    public void showLog(Object log) {

        Log.e(tag, log.toString());

    }



    /**

     * Toast.makeText

     * 

     * @param mContext

     * @param string

     */

    public void showToast(Object... string) {

        Toast.makeText(mActivity, String.valueOf(string.toString()), Toast.LENGTH_SHORT).show();

    }



    public void goAct(Class<?> cls, Boolean finish) {

        Intent intent = new Intent(mActivity, cls);

        startActivity(intent);

        if (finish) {

            this.finish();

        }

    }



    @Override

    public void onStart() {

        super.onStart();

        Log.e(tag, "onStart------");

    }



    @Override

    public void onResume() {

        super.onResume();

        Log.e(tag, "onResume------");

    }



    @Override

    public void onPause() {

        super.onPause();

        Log.e(tag, "onPause------");

    }



    @Override

    public void onStop() {

        super.onStop();

        Log.e(tag, "onStop------");

    }



    @Override

    public void onDestroy() {

        super.onDestroy();

        Log.e(tag, "onDestroy------");

    }



}

xml

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

<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"

    tools:context=".FragmentTabsActivity" >



    <FrameLayout

        android:id="@+id/realtabcontent"

        android:layout_width="match_parent"

        android:layout_height="0dip"

        android:layout_weight="1" />



    <SaveFragmentTabHost

        android:id="@android:id/tabhost"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:visibility="gone" >



        <FrameLayout

            android:id="@android:id/tabcontent"

            android:layout_width="0dp"

            android:layout_height="0dp"

            android:layout_weight="0" />

    </SaveFragmentTabHost>



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

<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="53dp"

    android:background="@android:color/black"

    android:baselineAligned="false"

    tools:context=".FragmentTabsActivity" >



    <LinearLayout

        android:id="@+id/tabLayoutHome"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:layout_weight="1.0"

        android:background="@drawable/button_actionbar_menu"

        android:gravity="center"

        android:orientation="vertical" >



        <TextView

            android:id="@+id/tabIconHome"

            style="@style/tab_top_style"

            android:text="@string/fontHomeSelect" >

        </TextView>



        <TextView

            style="@style/tab_bottom_style"

            android:text="@string/stringHome" >

        </TextView>

    </LinearLayout>



    <LinearLayout

        android:id="@+id/tabLayoutCelebrity"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:layout_weight="1.0"

        android:background="@drawable/button_actionbar_menu"

        android:gravity="center"

        android:orientation="vertical" >



        <TextView

            android:id="@+id/tabIconCelebrity"

            style="@style/tab_top_style"

            android:text="@string/fontCelebrity" >

        </TextView>



        <TextView

            style="@style/tab_bottom_style"

            android:text="@string/stringCelebrity" >

        </TextView>

    </LinearLayout>



    <LinearLayout

        android:id="@+id/tabLayoutBrand"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:layout_weight="1.0"

        android:background="@drawable/button_actionbar_menu"

        android:gravity="center"

        android:orientation="vertical" >



        <TextView

            android:id="@+id/tabIconBrand"

            style="@style/tab_top_style"

            android:text="@string/fontBrand" >

        </TextView>



        <TextView

            style="@style/tab_bottom_style"

            android:text="@string/stringBrand" >

        </TextView>

    </LinearLayout>



    <LinearLayout

        android:id="@+id/tabLayoutExplore"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:layout_weight="1.0"

        android:background="@drawable/button_actionbar_menu"

        android:gravity="center"

        android:orientation="vertical" >



        <TextView

            android:id="@+id/tabIconExplore"

            style="@style/tab_top_style"

            android:text="@string/fontExplore" >

        </TextView>



        <TextView

            style="@style/tab_bottom_style"

            android:text="@string/stringExplore" >

        </TextView>

    </LinearLayout>



    <LinearLayout

        android:id="@+id/tabLayoutMore"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:layout_weight="1.0"

        android:background="@drawable/button_actionbar_menu"

        android:gravity="center"

        android:orientation="vertical" >



        <TextView

            android:id="@+id/tabIconMore"

            style="@style/tab_top_style"

            android:text="@string/fontMore" >

        </TextView>



        <TextView

            style="@style/tab_bottom_style"

            android:text="@string/stringMore" >

        </TextView>

    </LinearLayout>



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

<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="53dp"

    android:background="@android:color/black"

    android:baselineAligned="false"

    tools:context=".FragmentTabsActivity" >



    <LinearLayout

        android:id="@+id/tabLayoutHome"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:layout_weight="1.0"

        android:background="@drawable/button_actionbar_menu"

        android:gravity="center"

        android:orientation="vertical" >



        <TextView

            android:id="@+id/tabIconHome"

            style="@style/tab_top_style"

            android:text="@string/fontHomeSelect" >

        </TextView>



        <TextView

            style="@style/tab_bottom_style"

            android:text="@string/stringHome" >

        </TextView>

    </LinearLayout>



    <LinearLayout

        android:id="@+id/tabLayoutCelebrity"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:layout_weight="1.0"

        android:background="@drawable/button_actionbar_menu"

        android:gravity="center"

        android:orientation="vertical" >



        <TextView

            android:id="@+id/tabIconCelebrity"

            style="@style/tab_top_style"

            android:text="@string/fontCelebrity" >

        </TextView>



        <TextView

            style="@style/tab_bottom_style"

            android:text="@string/stringCelebrity" >

        </TextView>

    </LinearLayout>



    <LinearLayout

        android:id="@+id/tabLayoutBrand"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:layout_weight="1.0"

        android:background="@drawable/button_actionbar_menu"

        android:gravity="center"

        android:orientation="vertical" >



        <TextView

            android:id="@+id/tabIconBrand"

            style="@style/tab_top_style"

            android:text="@string/fontBrand" >

        </TextView>



        <TextView

            style="@style/tab_bottom_style"

            android:text="@string/stringBrand" >

        </TextView>

    </LinearLayout>



    <LinearLayout

        android:id="@+id/tabLayoutExplore"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:layout_weight="1.0"

        android:background="@drawable/button_actionbar_menu"

        android:gravity="center"

        android:orientation="vertical" >



        <TextView

            android:id="@+id/tabIconExplore"

            style="@style/tab_top_style"

            android:text="@string/fontExplore" >

        </TextView>



        <TextView

            style="@style/tab_bottom_style"

            android:text="@string/stringExplore" >

        </TextView>

    </LinearLayout>



    <LinearLayout

        android:id="@+id/tabLayoutMore"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:layout_weight="1.0"

        android:background="@drawable/button_actionbar_menu"

        android:gravity="center"

        android:orientation="vertical" >



        <TextView

            android:id="@+id/tabIconMore"

            style="@style/tab_top_style"

            android:text="@string/fontMore" >

        </TextView>



        <TextView

            style="@style/tab_bottom_style"

            android:text="@string/stringMore" >

        </TextView>

    </LinearLayout>



</LinearLayout>

</LinearLayout>

SaveFragmentTabHost

/*

 * Copyright (C) 2012 The Android Open Source Project

 *

 * Licensed under the Apache License, Version 2.0 (the "License");

 * you may not use this file except in compliance with the License.

 * You may obtain a copy of the License at

 *

 *      http://www.apache.org/licenses/LICENSE-2.0

 *

 * Unless required by applicable law or agreed to in writing, software

 * distributed under the License is distributed on an "AS IS" BASIS,

 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

 * See the License for the specific language governing permissions and

 * limitations under the License.

 */



/**

 * Special TabHost that allows the use of {@link Fragment} objects for its tab

 * content. When placing this in a view hierarchy, after inflating the hierarchy

 * you must call {@link #setup(Context, FragmentManager, int)} to complete the

 * initialization of the tab host.

 * 

 * <p>

 * Here is a simple example of using a FragmentTabHost in an Activity:

 * 

 * {@sample

 * development/samples/Support4Demos/src/com/example/android/supportv4/app/

 * FragmentTabs.java complete}

 * 

 * <p>

 * This can also be used inside of a fragment through fragment nesting:

 * 

 * {@sample

 * development/samples/Support4Demos/src/com/example/android/supportv4/app/

 * FragmentTabsFragmentSupport.java complete}

 */

public class SaveFragmentTabHost extends TabHost implements TabHost.OnTabChangeListener {

    private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();

    private FrameLayout mRealTabContent;

    private Context mContext;

    private FragmentManager mFragmentManager;

    private int mContainerId;

    private TabHost.OnTabChangeListener mOnTabChangeListener;

    private TabInfo mLastTab;

    private boolean mAttached;



    static final class TabInfo {

        private final String tag;

        private final Class<?> clss;

        private final Bundle args;

        private Fragment fragment;



        TabInfo(String _tag, Class<?> _class, Bundle _args) {

            tag = _tag;

            clss = _class;

            args = _args;

        }

    }



    static class DummyTabFactory implements TabHost.TabContentFactory {

        private final Context mContext;



        public DummyTabFactory(Context context) {

            mContext = context;

        }



        @Override

        public View createTabContent(String tag) {

            View v = new View(mContext);

            v.setMinimumWidth(0);

            v.setMinimumHeight(0);

            return v;

        }

    }



    static class SavedState extends BaseSavedState {

        String curTab;



        SavedState(Parcelable superState) {

            super(superState);

        }



        private SavedState(Parcel in) {

            super(in);

            curTab = in.readString();

        }



        @Override

        public void writeToParcel(Parcel out, int flags) {

            super.writeToParcel(out, flags);

            out.writeString(curTab);

        }



        @Override

        public String toString() {

            return "FragmentTabHost.SavedState{" + Integer.toHexString(System.identityHashCode(this)) + " curTab=" + curTab + "}";

        }



        public static final Parcelable.Creator<SavedState> CREATOR = new Parcelable.Creator<SavedState>() {

            public SavedState createFromParcel(Parcel in) {

                return new SavedState(in);

            }



            public SavedState[] newArray(int size) {

                return new SavedState[size];

            }

        };

    }



    public SaveFragmentTabHost(Context context) {

        // Note that we call through to the version that takes an AttributeSet,

        // because the simple Context construct can result in a broken object!

        super(context, null);

        initFragmentTabHost(context, null);

    }



    public SaveFragmentTabHost(Context context, AttributeSet attrs) {

        super(context, attrs);

        initFragmentTabHost(context, attrs);

    }



    private void initFragmentTabHost(Context context, AttributeSet attrs) {

        TypedArray a = context.obtainStyledAttributes(attrs, new int[] { android.R.attr.inflatedId }, 0, 0);

        mContainerId = a.getResourceId(0, 0);

        a.recycle();



        super.setOnTabChangedListener(this);

    }



    private void ensureHierarchy(Context context) {

        // If owner hasn't made its own view hierarchy, then as a convenience

        // we will construct a standard one here.

        if (findViewById(android.R.id.tabs) == null) {

            LinearLayout ll = new LinearLayout(context);

            ll.setOrientation(LinearLayout.VERTICAL);

            addView(ll, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));



            TabWidget tw = new TabWidget(context);

            tw.setId(android.R.id.tabs);

            tw.setOrientation(TabWidget.HORIZONTAL);

            ll.addView(tw, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, 0));



            FrameLayout fl = new FrameLayout(context);

            fl.setId(android.R.id.tabcontent);

            ll.addView(fl, new LinearLayout.LayoutParams(0, 0, 0));



            mRealTabContent = fl = new FrameLayout(context);

            mRealTabContent.setId(mContainerId);

            ll.addView(fl, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0, 1));

        }

    }



    /**

     * @deprecated Don't call the original TabHost setup, you must instead call

     *             {@link #setup(Context, FragmentManager)} or

     *             {@link #setup(Context, FragmentManager, int)}.

     */

    @Override

    @Deprecated

    public void setup() {

        throw new IllegalStateException("Must call setup() that takes a Context and FragmentManager");

    }



    public void setup(Context context, FragmentManager manager) {

        ensureHierarchy(context); // Ensure views required by super.setup()

        super.setup();

        mContext = context;

        mFragmentManager = manager;

        ensureContent();

    }



    public void setup(Context context, FragmentManager manager, int containerId) {

        ensureHierarchy(context); // Ensure views required by super.setup()

        super.setup();

        mContext = context;

        mFragmentManager = manager;

        mContainerId = containerId;

        ensureContent();

        mRealTabContent.setId(containerId);



        // We must have an ID to be able to save/restore our state. If

        // the owner hasn't set one at this point, we will set it ourself.

        if (getId() == View.NO_ID) {

            setId(android.R.id.tabhost);

        }

    }



    private void ensureContent() {

        if (mRealTabContent == null) {

            mRealTabContent = (FrameLayout) findViewById(mContainerId);

            if (mRealTabContent == null) {

                throw new IllegalStateException("No tab content FrameLayout found for id " + mContainerId);

            }

        }

    }



    @Override

    public void setOnTabChangedListener(OnTabChangeListener l) {

        mOnTabChangeListener = l;

    }



    public void addTab(TabHost.TabSpec tabSpec, Class<?> clss, Bundle args) {

        tabSpec.setContent(new DummyTabFactory(mContext));

        String tag = tabSpec.getTag();



        TabInfo info = new TabInfo(tag, clss, args);



        if (mAttached) {

            // If we are already attached to the window, then check to make

            // sure this tab's fragment is inactive if it exists. This shouldn't

            // normally happen.

            info.fragment = mFragmentManager.findFragmentByTag(tag);

            if (info.fragment != null && !info.fragment.isDetached()) {

                FragmentTransaction ft = mFragmentManager.beginTransaction();

                //                ft.detach(info.fragment);

                ft.hide(info.fragment);

                ft.commit();

            }

        }



        mTabs.add(info);

        addTab(tabSpec);

    }



    @Override

    protected void onAttachedToWindow() {

        super.onAttachedToWindow();



        String currentTab = getCurrentTabTag();



        // Go through all tabs and make sure their fragments match

        // the correct state.

        FragmentTransaction ft = null;

        for (int i = 0; i < mTabs.size(); i++) {

            TabInfo tab = mTabs.get(i);

            tab.fragment = mFragmentManager.findFragmentByTag(tab.tag);

            //            if (tab.fragment != null && !tab.fragment.isDetached()) {

            if (tab.fragment != null) {

                if (tab.tag.equals(currentTab)) {

                    // The fragment for this tab is already there and

                    // active, and it is what we really want to have

                    // as the current tab. Nothing to do.

                    mLastTab = tab;

                } else {

                    // This fragment was restored in the active state,

                    // but is not the current tab. Deactivate it.

                    if (ft == null) {

                        ft = mFragmentManager.beginTransaction();

                    }

                    //                    ft.detach(tab.fragment);

                    ft.hide(tab.fragment);

                }

            }

        }



        // We are now ready to go. Make sure we are switched to the

        // correct tab.

        mAttached = true;

        ft = doTabChanged(currentTab, ft);

        if (ft != null) {

            ft.commit();

            mFragmentManager.executePendingTransactions();

        }

    }



    @Override

    protected void onDetachedFromWindow() {

        super.onDetachedFromWindow();

        mAttached = false;

    }



    @Override

    protected Parcelable onSaveInstanceState() {

        Parcelable superState = super.onSaveInstanceState();

        SavedState ss = new SavedState(superState);

        ss.curTab = getCurrentTabTag();

        return ss;

    }



    @Override

    protected void onRestoreInstanceState(Parcelable state) {

        SavedState ss = (SavedState) state;

        super.onRestoreInstanceState(ss.getSuperState());

        setCurrentTabByTag(ss.curTab);

    }



    @Override

    public void onTabChanged(String tabId) {

        if (mAttached) {

            FragmentTransaction ft = doTabChanged(tabId, null);

            if (ft != null) {

                ft.commit();

            }

        }

        if (mOnTabChangeListener != null) {

            mOnTabChangeListener.onTabChanged(tabId);

        }

    }



    private FragmentTransaction doTabChanged(String tabId, FragmentTransaction ft) {

        TabInfo newTab = null;

        for (int i = 0; i < mTabs.size(); i++) {

            TabInfo tab = mTabs.get(i);

            if (tab.tag.equals(tabId)) {

                newTab = tab;

            }

        }

        if (newTab == null) {

            throw new IllegalStateException("No tab known for tag " + tabId);

        }

        if (mLastTab != newTab) {

            if (ft == null) {

                ft = mFragmentManager.beginTransaction();

            }

            if (mLastTab != null) {

                if (mLastTab.fragment != null) {

                    //                    ft.detach(mLastTab.fragment);

                    ft.hide(mLastTab.fragment);

                }

            }

            if (newTab != null) {

                if (newTab.fragment == null) {

                    newTab.fragment = Fragment.instantiate(mContext, newTab.clss.getName(), newTab.args);

                    ft.add(mContainerId, newTab.fragment, newTab.tag);

                } else {

                    //                    ft.attach(newTab.fragment);

                    ft.show(newTab.fragment);

                }

            }



            mLastTab = newTab;

        }

        return ft;

    }

}

 or,Fragment deal

  使用FragmentTabHost时,Fragment之间切换时每次都会调用onCreateView方法,导致每次Fragment的布局都重绘,无法保持Fragment原有状态。

        解决办法:在Fragment onCreateView方法中缓存View

private View rootView;//缓存Fragment view  

      

    @Override  

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  

        if(rootView==null){  

            rootView=inflater.inflate(R.layout.tab_fragment, null);  

        }  

 //缓存的rootView需要判断是否已经被加过parent, 如果有parent需要从parent删除,要不然会发生这个rootview已经有parent的错误。  

        ViewGroup parent = (ViewGroup) rootView.getParent();  

        if (parent != null) {  

            parent.removeView(rootView);  

        }   

        return rootView;  

    }  

 

你可能感兴趣的:(Fragment)