首页 > 代码库 > Android Fragment Base

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 = http://www.mamicode.com/1;    public static final int REFRESH = 2;    public static final int LOADDATA = http://www.mamicode.com/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;      }  

 

Android Fragment Base