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产生原因,以及一些基本的用法和 ...
随机推荐
- B/S打印解决方案参考
使用Lodop 插件,该插件占用8000端口,未使用过,仅知依赖浏览器打印 http://blog.csdn.net/harderxin/article/details/17262945 强大的web ...
- 细说websocket - php篇(未完)
下面我画了一个图演示 client 和 server 之间建立 websocket 连接时握手部分,这个部分在 node 中可以十分轻松的完成,因为 node 提供的 net 模块已经对 socket ...
- Atitit. Attilax企业框架 AEF的发展里程总结
Atitit. Attilax企业框架 AEF的发展里程总结 1. Attilax企业框架and框架发展思想 1 2. AEF框架 2 2.1. 多语言支持,涉及的语言 java ,c# php py ...
- atitit.商业版 源码保护 与 java本地原生代码转换 的方案总结
atitit.商业版 源码保护 与 java本地原生代码转换 的方案总结 1. 为什么虚拟机语言容易被反编译 1 2. 源码泄露的问题问题 1 3. Excelsior JET 1 4. gcj.的流 ...
- iOS 开发如何入门
iOS 开发如何入门 新人如何入门 上一篇文章的回复中,很多读者让我推荐入门图书.其实我觉得每个人可能有自己喜欢的学习方式,我习惯的不一定适合你.不过我可以分享一下我当时是如何学习 iOS 开发的. ...
- 同一个String在使用不同的charset编码的时候equals仍然是返回true吗
1.对于ASCII字符,是的(只要该charset涵盖了ASCII编码),使用任何charset编码都不会影响equals的判断 2.对于非ASCII字符,不一定.例如同中文字符串"你好&q ...
- Django教程:[33]从数据库生成模型
在使用django做网站的时候,有时候我们的数据库来自一个已有的数据库,如何整合这个数据库呢? django提供了方便的方法来整合已有数据库,下面我们看看具体的方法: 1.先来设置数据库:在网站文件夹 ...
- maven 引入 net sf jsonlib 报错 has borken path
pom.xml 内容: <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json ...
- Spring Mvc中DispatcherServlet和Servlet的区别小结
在web开发过程中开始接触的是servlet,用来处理用户请求.这几年随着spring 框架越来越成熟,几乎成了java web开发界的主流框架.既然这么受欢迎肯定有它的优点,spring框架在原来的 ...
- linux回调函数的使用
#include<stdio.h> #include<pthread.h> #include<unistd.h> pthread_mutex_t mutex; pt ...