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. Hive 中的变量

    Hive的变量前面有一个命名空间,包括三个hiveconf,system,env,还有一个hivevar hiveconf的命名空间指的是hive-site.xml下面的配置变量值. system的命 ...

  2. Ubuntu 14.04主机上部署k8s集群

    部署结构 3台虚拟机,其中1台作为master,2台作为minion,都安装了最新版本的docker engine(目前是1.11.2) k8s版本是1.3.0 主要问题 部署步骤基本按照官方文档:h ...

  3. 1. A + B Problem【easy】

    Write a function that add two numbers A and B. You should not use + or any arithmetic operators. Not ...

  4. Python内置函数property()使用实例

    class Shuxing(): def __init__(self, size = 10): self.size = size def getSize(self): print('getSize') ...

  5. What is purpose of @ConditionalOnProperty annotation?

    http://stackoverflow.com/questions/26394778/what-is-purpose-of-conditionalonproperty-annotation **** ...

  6. iframe中子父窗口互调的js方法

    转载自:http://www.cnblogs.com/chinafine/archive/2011/09/15/2177746.html 一.父窗口调用iframe子窗口方法 1.HTML语法:< ...

  7. JavaScrip——简单练习(输出方式,简单表单验证)

    <script> //输出方式 document.write(Date());//获取当前时间 document.write(1); document.write("<p& ...

  8. CSS(七):浮动

    一.float属性取值:left:左浮动right:右浮动none:不浮动 先看下面的一个例子: <!DOCTYPE html> <html lang="en"& ...

  9. 树莓派系统Raspbian安装小结

    是有界面的系统. NOOBS, our easy installer for Raspbian  基于debian NOOBS stands for New Out Of Box Software h ...

  10. 通过Hadoop安全部署经验总结,开发出以下十大建议,以确保大型和复杂多样环境下的数据信息安全。

    通过Hadoop安全部署经验总结,开发出以下十大建议,以确保大型和复杂多样环境下的数据信息安全. 1.先下手为强!在规划部署阶段就确定数据的隐私保护策略,最好是在将数据放入到Hadoop之前就确定好保 ...