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;
    }  
时间: 2024-10-12 02:20:07

Android Fragment Base的相关文章

Android Fragment 真正的完全解析(上)

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37970961 自从Fragment出现,曾经有段时间,感觉大家谈什么都能跟Fragment谈上关系,做什么都要问下Fragment能实现不~~~哈哈,是不是有点过~~~ 本篇博客力求为大家说明Fragment如何产生,什么是Fragment,Fragment生命周期,如何静态和动态的使用Fragment,Fragment回退栈,Fragment事务:以及Fragment的一些特

Android Fragment 的使用,一些你不可不知的注意事项

Fragment,俗称碎片,自 Android 3.0 开始被引进并大量使用.然而就是这样耳熟能详的一个东西,在开发中我们还是会遇见各种各样的问题,层出不穷.所以,是时候总结一波了. Fragment 简介 作为 Activity 界面的一部分,Fragment 的存在必须依附于 Activity,并且与 Activity 一样,拥有自己的生命周期,同时处理用户的交互动作.同一个 Activity 可以有一个或多个 Fragment 作为界面内容,并且可以动态添加.删除 Fragment,灵活控

【Android自学日记】【转】Android Fragment 真正的完全解析(下)

上篇博客中已经介绍了Fragment产生原因,以及一些基本的用法和各种API,如果你还不了解,请看:Android Fragment 真正的完全解析(上). 本篇将介绍上篇博客提到的:如何管理Fragment回退栈,Fragment如何与Activity交互,Fragment与Activity交互的最佳实践,没有视图的Fragment的用处,使用Fragment创建对话框,如何与ActionBar,MenuItem集成等~~ 1.管理Fragment回退栈 类似与Android系统为Activi

android fragment 博客 学习记录

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37992017 上篇博客中已经介绍了Fragment产生原因,以及一些基本的用法和各种API,如果你还不了解,请看:Android Fragment 真正的完全解析(上). 本篇将介绍上篇博客提到的:如何管理Fragment回退栈,Fragment如何与Activity交互,Fragment与Activity交互的最佳实践,没有视图的Fragment的用处,使用Fragment创

Android Fragment应用实战,使用碎片向ActivityGroup说再见

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/13171191 现在Fragment的应用真的是越来越广泛了,之前Android在3.0版本加入Fragment的时候,主要是为了解决Android Pad屏幕比较大,空间不能充分利用的问题,但现在即使只是在手机上,也有很多的场景可以运用到Fragment了,今天我们就来学习其中一个特别棒的应用技巧. 很多手机应用都会有一个非常类似的功能,即屏幕的下方显示一行Tab标签选项,点击不

[Android]Fragment源码分析(一) 构造

Fragment是Android3.0之后提供的api,被大家广泛所熟知的主要原因还是因为随即附带的ViewPager控件.虽然我并不喜欢用它,但是它确实是一个相对不错的控件.还是我的一贯作风,我将从源码上向大家展示什么是Fragment.我们先写一个简单的代码对Fragment有个直观的认识:(为了保证我们方便调试,我们可以直接使用V4提供的源码包) FragmentTransaction t = getSupportFragmentManager().beginTransaction();

Android Fragment 嵌套使用报错

在新的SDK每次创建activity时,会自动生成 <pre name="code" class="java">public static class PlaceholderFragment extends Fragment fragment模块,在该模块的基础上进行嵌套fragment代码如下: <pre name="code" class="java">public static class Pla

Android Fragment 生命周期及其API使用

Fragment:( Fragment就相当于一个有生命周期的View,它的生命周期被所在的Activity的生命周期管理 ) 生命周期回调说明: onAttach(Activity)当Fragment与Activity发生关联时调用.onCreateView(LayoutInflater, ViewGroup,Bundle)创建该Fragment的视图onActivityCreated(Bundle)当Activity的onCreate方法返回时调用onDestoryView()与onCrea

Android Fragment 完全解析

参考文章:http://blog.csdn.net/guolin_blog/article/details/8881711 http://blog.csdn.net/guolin_blog/article/details/13171191 Android Fragment应用实战,使用碎片向ActivityGroup说再见 界面如下: 实现步骤: 程序结构: 编写主界面的xml文件 <?xml version="1.0" encoding="utf-8"?&g