Android Fragment Base
public class FragmentTabsActivity extends FragmentActivity implements OnClickListener { //定义FragmentTabHost对象
private SaveFragmentTabHost mTabHost;
//定义数组来存放Fragment界面
private final Class[] fragmentArray = { A.class, B.class, C.class, D.class, E.class,
F.class, G.class, H.class, I.class };
//定义数组来存放按钮图片
private int mIconFontArray[] = { R.string.A, R.string.B, R.string.C, R.string.D, R.string.E };
private int mIconSelectArray[] = { R.string.AA, R.string.BB, R.string.CC, R.string.DD,
R.string.EE};
//Tab选项卡的文字
private long keyNum; private LinearLayout tabsParent;
private MenuDialog menuDialog; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
keyNum = 0;
} /**
* 在这里获取到每个需要用到的控件的实例,并给它们设置好必要的点击事件。
*/
private void initViews() {
//实例化布局对象
// 得到fragment的个数
int count = fragmentArray.length;
tabsParent = (LinearLayout) findViewById(R.id.tabsParent);
//实例化TabHost对象,得到TabHost
mTabHost = (SaveFragmentTabHost) findViewById(android.R.id.tabhost);
mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent); for (int i = 0; i < count; i++) {
// 为每一个Tab按钮设置图标、文字和内容
String name = String.valueOf(i);
TabSpec tabSpec = mTabHost.newTabSpec(name).setIndicator(name);
//将Tab按钮添加进Tab选项卡中
mTabHost.addTab(tabSpec, fragmentArray[i], null);
//设置Tab按钮的背景
mTabHost.getTabWidget().getChildAt(i).setBackgroundResource(R.drawable.selector_tab);
}
mytabs = getTabHost();
mytabs.setOnTabChangedListener(new OnTabChangeListener() {
@Override
public void onTabChanged(String arg0) {
Log.i("***Selected Tab", "Im currently in tab with index::" + mytabs.getCurrentTab());
}
});
setupTabsBar();
menuDialog = new MenuDialog(mActivity, mTabHost);
} /**
* 给Tab按钮设置图标和文字
*/
private LinearLayout homeLayout, celebrityLayout, brandLayout, exploreLayout, moreLayout;
private TextView homeTv, celebrityTv, brandTv, exploreTv, moreTv; private void setupTabsBar() {
homeLayout = (LinearLayout) findViewById(R.id.tabLayoutHome);
homeLayout.setSelected(true);
celebrityLayout = (LinearLayout) findViewById(R.id.tabLayoutCelebrity);
brandLayout = (LinearLayout) findViewById(R.id.tabLayoutBrand);
exploreLayout = (LinearLayout) findViewById(R.id.tabLayoutExplore);
moreLayout = (LinearLayout) findViewById(R.id.tabLayoutMore); homeLayout.setOnClickListener(this);
celebrityLayout.setOnClickListener(this);
brandLayout.setOnClickListener(this);
exploreLayout.setOnClickListener(this);
moreLayout.setOnClickListener(this); homeTv = (TextView) findViewById(R.id.tabIconHome);
celebrityTv = (TextView) findViewById(R.id.tabIconCelebrity);
brandTv = (TextView) findViewById(R.id.tabIconBrand);
exploreTv = (TextView) findViewById(R.id.tabIconExplore);
moreTv = (TextView) findViewById(R.id.tabIconMore);
} @Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.tabLayoutHome:
setCurrentFragment(0);
break;
case R.id.tabLayoutCelebrity:
setCurrentFragment(1);
break;
case R.id.tabLayoutBrand:
setCurrentFragment(2);
break;
case R.id.tabLayoutExplore:
setCurrentFragment(3);
break;
case R.id.tabLayoutMore:
setCurrentFragment(4);
menuDialog.home();
break;
}
} private void setCurrentFragment(int index) {
homeLayout.setSelected(index == 0);
celebrityLayout.setSelected(index == 1);
brandLayout.setSelected(index == 2);
exploreLayout.setSelected(index == 3);
moreLayout.setSelected(index == 4); homeTv.setText(index == 0 ? getResources().getString(mIconSelectArray[0]) : getResources().getString(mIconFontArray[0]));
celebrityTv.setText(index == 1 ? getResources().getString(mIconSelectArray[1]) : getResources().getString(mIconFontArray[1]));
brandTv.setText(index == 2 ? getResources().getString(mIconSelectArray[2]) : getResources().getString(mIconFontArray[2]));
exploreTv.setText(index == 3 ? getResources().getString(mIconSelectArray[3]) : getResources().getString(mIconFontArray[3]));
moreTv.setText(index == 4 ? getResources().getString(mIconSelectArray[4]) : getResources().getString(mIconFontArray[4]));
if (index != 4)
mTabHost.setCurrentTab(index); } @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
if ((System.currentTimeMillis() - keyNum) > 2000) {
Toast.makeText(mActivity, "再按一次退出", Toast.LENGTH_SHORT).show();
keyNum = System.currentTimeMillis();
} else {
imageLoader.stop();
System.exit(0);
finish();
android.os.Process.killProcess(android.os.Process.myPid());
}
return true;
}
return super.onKeyDown(keyCode, event);
} }
/**BaseActivity**/
public class Activity extends Activity implements OnClickListener {
/**tag 用于测试log用 **/
public String tag = this.getClass().getSimpleName();
/**Activity**/
protected Activity mActivity;
/**loading**/
protected Dialog progressDialog;
/** 实例化ImageLoader**/
protected ImageLoader imageLoader;
/**显示图片设置**/
protected DisplayImageOptions options;
/**用户Token**/
public String userToken; public ObjectMapper mapper = new ObjectMapper(); /**翻页相关**/
public int start = 1;
public int refreshCnt = 1;
public int dataStatus; public static final int DONE = 0; public static final int INITDATA = 1; public static final int REFRESH = 2; public static final int LOADDATA = 3; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e(tag, "onCreate------"); mActivity = DFActivity.this; progressDialog = DialogUtil.createLoadingDialog(mActivity, R.string.load_data_content); imageLoader = ImageLoader.getInstance();
options = new AppUtils().getOptions(); userToken = SharedUtil.getInstance(mActivity).getString(AppConstants.JSON_USER_TOKEN); } /**
* 按钮注册和监听事件注册
* 注册IconFont字体
*/
/**
* @param title
*/
public void initActionBar(String title) {
TextView actionTitle = (TextView) findViewById(R.id.actionTitle);
actionTitle.setText(title); Button btnBack = (Button) findViewById(R.id.actionBack);
AppUtils.iconFont(mActivity, btnBack, 30, 0);
btnBack.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mActivity.finish();
}
}); Button btnMenu = (Button) findViewById(R.id.actionMenu);
AppUtils.iconFont(mActivity, btnMenu, 30, 0);
btnMenu.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// mActivity.finish();
}
});
} @Override
public void onClick(View v) { } @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
this.finish();
}
return super.onKeyDown(keyCode, event);
} public void initFollow() {
// followed = mActivity.getString(R.string.btnFollowed);
// addFollow = mActivity.getString(R.string.btnAddFollow); } public void showLog(Object log) {
Log.e(tag, log.toString());
} /**
* Toast.makeText
*
* @param mContext
* @param string
*/
public void showToast(Object... string) {
Toast.makeText(mActivity, String.valueOf(string.toString()), Toast.LENGTH_SHORT).show();
} public void goAct(Class<?> cls, Boolean finish) {
Intent intent = new Intent(mActivity, cls);
startActivity(intent);
if (finish) {
this.finish();
}
} @Override
public void onStart() {
super.onStart();
Log.e(tag, "onStart------");
} @Override
public void onResume() {
super.onResume();
Log.e(tag, "onResume------");
} @Override
public void onPause() {
super.onPause();
Log.e(tag, "onPause------");
} @Override
public void onStop() {
super.onStop();
Log.e(tag, "onStop------");
} @Override
public void onDestroy() {
super.onDestroy();
Log.e(tag, "onDestroy------");
} }
xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".FragmentTabsActivity" > <FrameLayout
android:id="@+id/realtabcontent"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1" /> <SaveFragmentTabHost
android:id="@android:id/tabhost"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone" > <FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="0" />
</SaveFragmentTabHost> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="53dp"
android:background="@android:color/black"
android:baselineAligned="false"
tools:context=".FragmentTabsActivity" > <LinearLayout
android:id="@+id/tabLayoutHome"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1.0"
android:background="@drawable/button_actionbar_menu"
android:gravity="center"
android:orientation="vertical" > <TextView
android:id="@+id/tabIconHome"
style="@style/tab_top_style"
android:text="@string/fontHomeSelect" >
</TextView> <TextView
style="@style/tab_bottom_style"
android:text="@string/stringHome" >
</TextView>
</LinearLayout> <LinearLayout
android:id="@+id/tabLayoutCelebrity"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1.0"
android:background="@drawable/button_actionbar_menu"
android:gravity="center"
android:orientation="vertical" > <TextView
android:id="@+id/tabIconCelebrity"
style="@style/tab_top_style"
android:text="@string/fontCelebrity" >
</TextView> <TextView
style="@style/tab_bottom_style"
android:text="@string/stringCelebrity" >
</TextView>
</LinearLayout> <LinearLayout
android:id="@+id/tabLayoutBrand"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1.0"
android:background="@drawable/button_actionbar_menu"
android:gravity="center"
android:orientation="vertical" > <TextView
android:id="@+id/tabIconBrand"
style="@style/tab_top_style"
android:text="@string/fontBrand" >
</TextView> <TextView
style="@style/tab_bottom_style"
android:text="@string/stringBrand" >
</TextView>
</LinearLayout> <LinearLayout
android:id="@+id/tabLayoutExplore"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1.0"
android:background="@drawable/button_actionbar_menu"
android:gravity="center"
android:orientation="vertical" > <TextView
android:id="@+id/tabIconExplore"
style="@style/tab_top_style"
android:text="@string/fontExplore" >
</TextView> <TextView
style="@style/tab_bottom_style"
android:text="@string/stringExplore" >
</TextView>
</LinearLayout> <LinearLayout
android:id="@+id/tabLayoutMore"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1.0"
android:background="@drawable/button_actionbar_menu"
android:gravity="center"
android:orientation="vertical" > <TextView
android:id="@+id/tabIconMore"
style="@style/tab_top_style"
android:text="@string/fontMore" >
</TextView> <TextView
style="@style/tab_bottom_style"
android:text="@string/stringMore" >
</TextView>
</LinearLayout> </LinearLayout><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="53dp"
android:background="@android:color/black"
android:baselineAligned="false"
tools:context=".FragmentTabsActivity" > <LinearLayout
android:id="@+id/tabLayoutHome"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1.0"
android:background="@drawable/button_actionbar_menu"
android:gravity="center"
android:orientation="vertical" > <TextView
android:id="@+id/tabIconHome"
style="@style/tab_top_style"
android:text="@string/fontHomeSelect" >
</TextView> <TextView
style="@style/tab_bottom_style"
android:text="@string/stringHome" >
</TextView>
</LinearLayout> <LinearLayout
android:id="@+id/tabLayoutCelebrity"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1.0"
android:background="@drawable/button_actionbar_menu"
android:gravity="center"
android:orientation="vertical" > <TextView
android:id="@+id/tabIconCelebrity"
style="@style/tab_top_style"
android:text="@string/fontCelebrity" >
</TextView> <TextView
style="@style/tab_bottom_style"
android:text="@string/stringCelebrity" >
</TextView>
</LinearLayout> <LinearLayout
android:id="@+id/tabLayoutBrand"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1.0"
android:background="@drawable/button_actionbar_menu"
android:gravity="center"
android:orientation="vertical" > <TextView
android:id="@+id/tabIconBrand"
style="@style/tab_top_style"
android:text="@string/fontBrand" >
</TextView> <TextView
style="@style/tab_bottom_style"
android:text="@string/stringBrand" >
</TextView>
</LinearLayout> <LinearLayout
android:id="@+id/tabLayoutExplore"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1.0"
android:background="@drawable/button_actionbar_menu"
android:gravity="center"
android:orientation="vertical" > <TextView
android:id="@+id/tabIconExplore"
style="@style/tab_top_style"
android:text="@string/fontExplore" >
</TextView> <TextView
style="@style/tab_bottom_style"
android:text="@string/stringExplore" >
</TextView>
</LinearLayout> <LinearLayout
android:id="@+id/tabLayoutMore"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1.0"
android:background="@drawable/button_actionbar_menu"
android:gravity="center"
android:orientation="vertical" > <TextView
android:id="@+id/tabIconMore"
style="@style/tab_top_style"
android:text="@string/fontMore" >
</TextView> <TextView
style="@style/tab_bottom_style"
android:text="@string/stringMore" >
</TextView>
</LinearLayout> </LinearLayout>
</LinearLayout>
SaveFragmentTabHost
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/ /**
* Special TabHost that allows the use of {@link Fragment} objects for its tab
* content. When placing this in a view hierarchy, after inflating the hierarchy
* you must call {@link #setup(Context, FragmentManager, int)} to complete the
* initialization of the tab host.
*
* <p>
* Here is a simple example of using a FragmentTabHost in an Activity:
*
* {@sample
* development/samples/Support4Demos/src/com/example/android/supportv4/app/
* FragmentTabs.java complete}
*
* <p>
* This can also be used inside of a fragment through fragment nesting:
*
* {@sample
* development/samples/Support4Demos/src/com/example/android/supportv4/app/
* FragmentTabsFragmentSupport.java complete}
*/
public class SaveFragmentTabHost extends TabHost implements TabHost.OnTabChangeListener {
private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
private FrameLayout mRealTabContent;
private Context mContext;
private FragmentManager mFragmentManager;
private int mContainerId;
private TabHost.OnTabChangeListener mOnTabChangeListener;
private TabInfo mLastTab;
private boolean mAttached; static final class TabInfo {
private final String tag;
private final Class<?> clss;
private final Bundle args;
private Fragment fragment; TabInfo(String _tag, Class<?> _class, Bundle _args) {
tag = _tag;
clss = _class;
args = _args;
}
} static class DummyTabFactory implements TabHost.TabContentFactory {
private final Context mContext; public DummyTabFactory(Context context) {
mContext = context;
} @Override
public View createTabContent(String tag) {
View v = new View(mContext);
v.setMinimumWidth(0);
v.setMinimumHeight(0);
return v;
}
} static class SavedState extends BaseSavedState {
String curTab; SavedState(Parcelable superState) {
super(superState);
} private SavedState(Parcel in) {
super(in);
curTab = in.readString();
} @Override
public void writeToParcel(Parcel out, int flags) {
super.writeToParcel(out, flags);
out.writeString(curTab);
} @Override
public String toString() {
return "FragmentTabHost.SavedState{" + Integer.toHexString(System.identityHashCode(this)) + " curTab=" + curTab + "}";
} public static final Parcelable.Creator<SavedState> CREATOR = new Parcelable.Creator<SavedState>() {
public SavedState createFromParcel(Parcel in) {
return new SavedState(in);
} public SavedState[] newArray(int size) {
return new SavedState[size];
}
};
} public SaveFragmentTabHost(Context context) {
// Note that we call through to the version that takes an AttributeSet,
// because the simple Context construct can result in a broken object!
super(context, null);
initFragmentTabHost(context, null);
} public SaveFragmentTabHost(Context context, AttributeSet attrs) {
super(context, attrs);
initFragmentTabHost(context, attrs);
} private void initFragmentTabHost(Context context, AttributeSet attrs) {
TypedArray a = context.obtainStyledAttributes(attrs, new int[] { android.R.attr.inflatedId }, 0, 0);
mContainerId = a.getResourceId(0, 0);
a.recycle(); super.setOnTabChangedListener(this);
} private void ensureHierarchy(Context context) {
// If owner hasn't made its own view hierarchy, then as a convenience
// we will construct a standard one here.
if (findViewById(android.R.id.tabs) == null) {
LinearLayout ll = new LinearLayout(context);
ll.setOrientation(LinearLayout.VERTICAL);
addView(ll, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); TabWidget tw = new TabWidget(context);
tw.setId(android.R.id.tabs);
tw.setOrientation(TabWidget.HORIZONTAL);
ll.addView(tw, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, 0)); FrameLayout fl = new FrameLayout(context);
fl.setId(android.R.id.tabcontent);
ll.addView(fl, new LinearLayout.LayoutParams(0, 0, 0)); mRealTabContent = fl = new FrameLayout(context);
mRealTabContent.setId(mContainerId);
ll.addView(fl, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0, 1));
}
} /**
* @deprecated Don't call the original TabHost setup, you must instead call
* {@link #setup(Context, FragmentManager)} or
* {@link #setup(Context, FragmentManager, int)}.
*/
@Override
@Deprecated
public void setup() {
throw new IllegalStateException("Must call setup() that takes a Context and FragmentManager");
} public void setup(Context context, FragmentManager manager) {
ensureHierarchy(context); // Ensure views required by super.setup()
super.setup();
mContext = context;
mFragmentManager = manager;
ensureContent();
} public void setup(Context context, FragmentManager manager, int containerId) {
ensureHierarchy(context); // Ensure views required by super.setup()
super.setup();
mContext = context;
mFragmentManager = manager;
mContainerId = containerId;
ensureContent();
mRealTabContent.setId(containerId); // We must have an ID to be able to save/restore our state. If
// the owner hasn't set one at this point, we will set it ourself.
if (getId() == View.NO_ID) {
setId(android.R.id.tabhost);
}
} private void ensureContent() {
if (mRealTabContent == null) {
mRealTabContent = (FrameLayout) findViewById(mContainerId);
if (mRealTabContent == null) {
throw new IllegalStateException("No tab content FrameLayout found for id " + mContainerId);
}
}
} @Override
public void setOnTabChangedListener(OnTabChangeListener l) {
mOnTabChangeListener = l;
} public void addTab(TabHost.TabSpec tabSpec, Class<?> clss, Bundle args) {
tabSpec.setContent(new DummyTabFactory(mContext));
String tag = tabSpec.getTag(); TabInfo info = new TabInfo(tag, clss, args); if (mAttached) {
// If we are already attached to the window, then check to make
// sure this tab's fragment is inactive if it exists. This shouldn't
// normally happen.
info.fragment = mFragmentManager.findFragmentByTag(tag);
if (info.fragment != null && !info.fragment.isDetached()) {
FragmentTransaction ft = mFragmentManager.beginTransaction();
// ft.detach(info.fragment);
ft.hide(info.fragment);
ft.commit();
}
} mTabs.add(info);
addTab(tabSpec);
} @Override
protected void onAttachedToWindow() {
super.onAttachedToWindow(); String currentTab = getCurrentTabTag(); // Go through all tabs and make sure their fragments match
// the correct state.
FragmentTransaction ft = null;
for (int i = 0; i < mTabs.size(); i++) {
TabInfo tab = mTabs.get(i);
tab.fragment = mFragmentManager.findFragmentByTag(tab.tag);
// if (tab.fragment != null && !tab.fragment.isDetached()) {
if (tab.fragment != null) {
if (tab.tag.equals(currentTab)) {
// The fragment for this tab is already there and
// active, and it is what we really want to have
// as the current tab. Nothing to do.
mLastTab = tab;
} else {
// This fragment was restored in the active state,
// but is not the current tab. Deactivate it.
if (ft == null) {
ft = mFragmentManager.beginTransaction();
}
// ft.detach(tab.fragment);
ft.hide(tab.fragment);
}
}
} // We are now ready to go. Make sure we are switched to the
// correct tab.
mAttached = true;
ft = doTabChanged(currentTab, ft);
if (ft != null) {
ft.commit();
mFragmentManager.executePendingTransactions();
}
} @Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
mAttached = false;
} @Override
protected Parcelable onSaveInstanceState() {
Parcelable superState = super.onSaveInstanceState();
SavedState ss = new SavedState(superState);
ss.curTab = getCurrentTabTag();
return ss;
} @Override
protected void onRestoreInstanceState(Parcelable state) {
SavedState ss = (SavedState) state;
super.onRestoreInstanceState(ss.getSuperState());
setCurrentTabByTag(ss.curTab);
} @Override
public void onTabChanged(String tabId) {
if (mAttached) {
FragmentTransaction ft = doTabChanged(tabId, null);
if (ft != null) {
ft.commit();
}
}
if (mOnTabChangeListener != null) {
mOnTabChangeListener.onTabChanged(tabId);
}
} private FragmentTransaction doTabChanged(String tabId, FragmentTransaction ft) {
TabInfo newTab = null;
for (int i = 0; i < mTabs.size(); i++) {
TabInfo tab = mTabs.get(i);
if (tab.tag.equals(tabId)) {
newTab = tab;
}
}
if (newTab == null) {
throw new IllegalStateException("No tab known for tag " + tabId);
}
if (mLastTab != newTab) {
if (ft == null) {
ft = mFragmentManager.beginTransaction();
}
if (mLastTab != null) {
if (mLastTab.fragment != null) {
// ft.detach(mLastTab.fragment);
ft.hide(mLastTab.fragment);
}
}
if (newTab != null) {
if (newTab.fragment == null) {
newTab.fragment = Fragment.instantiate(mContext, newTab.clss.getName(), newTab.args);
ft.add(mContainerId, newTab.fragment, newTab.tag);
} else {
// ft.attach(newTab.fragment);
ft.show(newTab.fragment);
}
} mLastTab = newTab;
}
return ft;
}
}
or,Fragment deal
解决办法:在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的更多相关文章
- [置顶]
xamarin android Fragment实现底部导航栏
前段时间写了篇关于Fragment的文章,介绍了基础的概念,用静态和动态的方式加载Fragment Xamarin Android Fragment的两种加载方式.下面的这个例子介绍xamarin ...
- Xamarin Android Fragment的两种加载方式
android Fragment的重点: 3.0版本后引入,即minSdk要大于11 Fragment需要嵌套在Activity中使用,当然也可以嵌套到另外一个Fragment中,但这个被嵌套的Fra ...
- 【Android自学日记】【转】Android Fragment 真正的完全解析(下)
上篇博客中已经介绍了Fragment产生原因,以及一些基本的用法和各种API,如果你还不了解,请看:Android Fragment 真正的完全解析(上). 本篇将介绍上篇博客提到的:如何管理Frag ...
- Android Fragment使用(四) Toolbar使用及Fragment中的Toolbar处理
Toolbar作为ActionBar使用介绍 本文介绍了在Android中将Toolbar作为ActionBar使用的方法. 并且介绍了在Fragment和嵌套Fragment中使用Toolbar作为 ...
- Android Fragment使用(三) Activity, Fragment, WebView的状态保存和恢复
Android中的状态保存和恢复 Android中的状态保存和恢复, 包括Activity和Fragment以及其中View的状态处理. Activity的状态除了其中的View和Fragment的状 ...
- Android Fragment使用(二) 嵌套Fragments (Nested Fragments) 的使用及常见错误
嵌套Fragment的使用及常见错误 嵌套Fragments (Nested Fragments), 是在Fragment内部又添加Fragment. 使用时, 主要要依靠宿主Fragment的 ge ...
- Android Fragment使用(一) 基础篇 温故知新
Fragment使用的基本知识点总结, 包括Fragment的添加, 参数传递和通信, 生命周期和各种操作. Fragment使用基础 Fragment添加 方法一: 布局里的标签 标识符: tag, ...
- Android Fragment应用实战
现在Fragment的应用真的是越来越广泛了,之前Android在3.0版本加入Fragment的时候,主要是为了解决Android Pad屏幕比较大,空间不能充分利用的问题,但现在即使只是在手机上, ...
- Android Fragment 真正的完全解析(下)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37992017 上篇博客中已经介绍了Fragment产生原因,以及一些基本的用法和 ...
随机推荐
- Hive 中的变量
Hive的变量前面有一个命名空间,包括三个hiveconf,system,env,还有一个hivevar hiveconf的命名空间指的是hive-site.xml下面的配置变量值. system的命 ...
- Ubuntu 14.04主机上部署k8s集群
部署结构 3台虚拟机,其中1台作为master,2台作为minion,都安装了最新版本的docker engine(目前是1.11.2) k8s版本是1.3.0 主要问题 部署步骤基本按照官方文档:h ...
- 1. A + B Problem【easy】
Write a function that add two numbers A and B. You should not use + or any arithmetic operators. Not ...
- Python内置函数property()使用实例
class Shuxing(): def __init__(self, size = 10): self.size = size def getSize(self): print('getSize') ...
- What is purpose of @ConditionalOnProperty annotation?
http://stackoverflow.com/questions/26394778/what-is-purpose-of-conditionalonproperty-annotation **** ...
- iframe中子父窗口互调的js方法
转载自:http://www.cnblogs.com/chinafine/archive/2011/09/15/2177746.html 一.父窗口调用iframe子窗口方法 1.HTML语法:< ...
- JavaScrip——简单练习(输出方式,简单表单验证)
<script> //输出方式 document.write(Date());//获取当前时间 document.write(1); document.write("<p& ...
- CSS(七):浮动
一.float属性取值:left:左浮动right:右浮动none:不浮动 先看下面的一个例子: <!DOCTYPE html> <html lang="en"& ...
- 树莓派系统Raspbian安装小结
是有界面的系统. NOOBS, our easy installer for Raspbian 基于debian NOOBS stands for New Out Of Box Software h ...
- 通过Hadoop安全部署经验总结,开发出以下十大建议,以确保大型和复杂多样环境下的数据信息安全。
通过Hadoop安全部署经验总结,开发出以下十大建议,以确保大型和复杂多样环境下的数据信息安全. 1.先下手为强!在规划部署阶段就确定数据的隐私保护策略,最好是在将数据放入到Hadoop之前就确定好保 ...