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;
}

Android Fragment Base的更多相关文章

  1. [置顶] xamarin android Fragment实现底部导航栏

    前段时间写了篇关于Fragment的文章,介绍了基础的概念,用静态和动态的方式加载Fragment  Xamarin Android Fragment的两种加载方式.下面的这个例子介绍xamarin ...

  2. Xamarin Android Fragment的两种加载方式

    android Fragment的重点: 3.0版本后引入,即minSdk要大于11 Fragment需要嵌套在Activity中使用,当然也可以嵌套到另外一个Fragment中,但这个被嵌套的Fra ...

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

    上篇博客中已经介绍了Fragment产生原因,以及一些基本的用法和各种API,如果你还不了解,请看:Android Fragment 真正的完全解析(上). 本篇将介绍上篇博客提到的:如何管理Frag ...

  4. Android Fragment使用(四) Toolbar使用及Fragment中的Toolbar处理

    Toolbar作为ActionBar使用介绍 本文介绍了在Android中将Toolbar作为ActionBar使用的方法. 并且介绍了在Fragment和嵌套Fragment中使用Toolbar作为 ...

  5. Android Fragment使用(三) Activity, Fragment, WebView的状态保存和恢复

    Android中的状态保存和恢复 Android中的状态保存和恢复, 包括Activity和Fragment以及其中View的状态处理. Activity的状态除了其中的View和Fragment的状 ...

  6. Android Fragment使用(二) 嵌套Fragments (Nested Fragments) 的使用及常见错误

    嵌套Fragment的使用及常见错误 嵌套Fragments (Nested Fragments), 是在Fragment内部又添加Fragment. 使用时, 主要要依靠宿主Fragment的 ge ...

  7. Android Fragment使用(一) 基础篇 温故知新

    Fragment使用的基本知识点总结, 包括Fragment的添加, 参数传递和通信, 生命周期和各种操作. Fragment使用基础 Fragment添加 方法一: 布局里的标签 标识符: tag, ...

  8. Android Fragment应用实战

    现在Fragment的应用真的是越来越广泛了,之前Android在3.0版本加入Fragment的时候,主要是为了解决Android Pad屏幕比较大,空间不能充分利用的问题,但现在即使只是在手机上, ...

  9. Android Fragment 真正的完全解析(下)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37992017 上篇博客中已经介绍了Fragment产生原因,以及一些基本的用法和 ...

随机推荐

  1. Javascript中的对象和原型(一)(转载)

    面向对象的语言(如Java)中有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.但是,JavaScript 没有类的概念,因此它的对象也与基于类的语言中的对象有所不同. 要了解面向对象,首 ...

  2. 老生常谈combobox和combotree模糊查询

    FIRST /** * combobox和combotree模糊查询 * combotree 结果显示两级父节点(手动设置数量) * 键盘上下键选择叶子节点 * 键盘回车键设置文本的值 */ (fun ...

  3. CakePHP不支持path/to路径,前后台无法方法

    本来想把前后台分离,可是阅读了cakephp的说明,才发现.cakephp根本就不支持path/to路径. cakephp官网给出的 管理员分离方式:http://book.cakephp.org/2 ...

  4. [svc]salt安装lamp

    在批量安装软件前,先找台测试机yum装一遍,看是否报错等,是否依赖包全等 . 本次我们在dev环境下搞. 先看一下已搞成功的目录结构 定义dev环境的第二个好处 搞清楚逻辑结构和调用关系很重要,不然之 ...

  5. cocos2d-x实例学习之常用类及其概要作用

    CCLayer,CCScene CCLayer类对应cocos2d-x引擎里的布景.每个游戏场景中都可以有很多层,每一层负责各自的任务,例如专门负责显示背景.专门负责显示道具和专门负责显示人物角色等. ...

  6. swift基础知识

    let 声明常量var 声明变量 ?可以为空 !必须为所声明类型 swift中文教程:http://c.biancheng.net/cpp/swift/jiaocheng/

  7. Ecshop安装的坑,建议不要使用!

    最近因为工作的需要,安装了下ecshop,这个曾经的火爆开源程序,现在也呈现出疲态. 1.请看官方的运行环境推荐: 服务器端运行环境推荐·php版本5.0以上5.3以下的版本(推荐使用5.2系列版本) ...

  8. echarts报表

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...

  9. Linux samba 服务的配置

    今天有个学生问我 samba 服务怎么配置,所以晚上特意研究一下怎么配置这个服务. 过程如下: sudo apt-get install samba samba-common // 安装 samba ...

  10. Ubuntu 12.04下LAMP环境的搭建

    首先 apt-get install update 一下 sudo apt-get install update 安装MySQL 的服务端和客户端 sudo apt-get install mysql ...