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. B/S打印解决方案参考

    使用Lodop 插件,该插件占用8000端口,未使用过,仅知依赖浏览器打印 http://blog.csdn.net/harderxin/article/details/17262945 强大的web ...

  2. 细说websocket - php篇(未完)

    下面我画了一个图演示 client 和 server 之间建立 websocket 连接时握手部分,这个部分在 node 中可以十分轻松的完成,因为 node 提供的 net 模块已经对 socket ...

  3. Atitit. Attilax企业框架 AEF的发展里程总结

    Atitit. Attilax企业框架 AEF的发展里程总结 1. Attilax企业框架and框架发展思想 1 2. AEF框架 2 2.1. 多语言支持,涉及的语言 java ,c# php py ...

  4. atitit.商业版 源码保护 与 java本地原生代码转换 的方案总结

    atitit.商业版 源码保护 与 java本地原生代码转换 的方案总结 1. 为什么虚拟机语言容易被反编译 1 2. 源码泄露的问题问题 1 3. Excelsior JET 1 4. gcj.的流 ...

  5. iOS 开发如何入门

    iOS 开发如何入门 新人如何入门 上一篇文章的回复中,很多读者让我推荐入门图书.其实我觉得每个人可能有自己喜欢的学习方式,我习惯的不一定适合你.不过我可以分享一下我当时是如何学习 iOS 开发的. ...

  6. 同一个String在使用不同的charset编码的时候equals仍然是返回true吗

    1.对于ASCII字符,是的(只要该charset涵盖了ASCII编码),使用任何charset编码都不会影响equals的判断 2.对于非ASCII字符,不一定.例如同中文字符串"你好&q ...

  7. Django教程:[33]从数据库生成模型

    在使用django做网站的时候,有时候我们的数据库来自一个已有的数据库,如何整合这个数据库呢? django提供了方便的方法来整合已有数据库,下面我们看看具体的方法: 1.先来设置数据库:在网站文件夹 ...

  8. maven 引入 net sf jsonlib 报错 has borken path

    pom.xml 内容: <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json ...

  9. Spring Mvc中DispatcherServlet和Servlet的区别小结

    在web开发过程中开始接触的是servlet,用来处理用户请求.这几年随着spring 框架越来越成熟,几乎成了java web开发界的主流框架.既然这么受欢迎肯定有它的优点,spring框架在原来的 ...

  10. linux回调函数的使用

    #include<stdio.h> #include<pthread.h> #include<unistd.h> pthread_mutex_t mutex; pt ...