1.主流框架搭建:TabHost + Fragment 搭建

布局文件:

    <FrameLayoutandroid:id="@+id/realtabcontent"android:layout_width="fill_parent"android:layout_height="0dip"android:layout_weight="1"android:background="@color/bg_color"/><cniao5.com.cniao5shop.widget.FragmentTabHostandroid:id="@android:id/tabhost"android:layout_width="fill_parent"android:layout_height="wrap_content"android:background="@color/white"></cniao5.com.cniao5shop.widget.FragmentTabHost>
复制代码

selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><!-- Non focused states --><item android:state_focused="false" android:state_selected="false" android:state_pressed="false" android:drawable="@mipmap/icon_home" /><item android:state_focused="false" android:state_selected="true" android:state_pressed="false" android:drawable="@mipmap/icon_home_press" /><!-- Focused states --><item android:state_focused="true" android:state_selected="false" android:state_pressed="false" android:drawable="@mipmap/icon_home_press" /><item android:state_focused="true" android:state_selected="true" android:state_pressed="false" android:drawable="@mipmap/icon_home_press" /><!-- Pressed --><item android:state_selected="true" android:state_pressed="true" android:drawable="@mipmap/icon_home_press" /><item android:state_pressed="true" android:drawable="@mipmap/icon_home_press" /></selector>
复制代码

代码实现:

    private LayoutInflater mInflater;private FragmentTabHost mTabhost;private CartFragment cartFragment;private List<Tab> mTabs = new ArrayList<>(5);
复制代码
private void initTab() {Tab tab_home = new Tab(HomeFragment.class,R.string.home,R.drawable.selector_icon_home);Tab tab_hot = new Tab(HotFragment.class,R.string.hot,R.drawable.selector_icon_hot);Tab tab_category = new Tab(CategoryFragment.class,R.string.catagory,R.drawable.selector_icon_category);Tab tab_cart = new Tab(CartFragment.class,R.string.cart,R.drawable.selector_icon_cart);Tab tab_mine = new Tab(MineFragment.class,R.string.mine,R.drawable.selector_icon_mine);mTabs.add(tab_home);mTabs.add(tab_hot);mTabs.add(tab_category);mTabs.add(tab_cart);mTabs.add(tab_mine);mInflater = LayoutInflater.from(this);mTabhost = (FragmentTabHost) this.findViewById(android.R.id.tabhost);mTabhost.setup(this,getSupportFragmentManager(),R.id.realtabcontent);for (Tab tab : mTabs){TabHost.TabSpec tabSpec = mTabhost.newTabSpec(getString(tab.getTitle()));tabSpec.setIndicator(buildIndicator(tab));mTabhost.addTab(tabSpec,tab.getFragment(),null);}mTabhost.setOnTabChangedListener(new TabHost.OnTabChangeListener() {@Overridepublic void onTabChanged(String tabId) {if(tabId==getString(R.string.cart)){refData();}}});mTabhost.getTabWidget().setShowDividers(LinearLayout.SHOW_DIVIDER_NONE);mTabhost.setCurrentTab(0);}private void refData(){if(cartFragment == null){Fragment fragment =  getSupportFragmentManager().findFragmentByTag(getString(R.string.cart));if(fragment !=null){cartFragment= (CartFragment) fragment;cartFragment.refData();}}else{cartFragment.refData();}}private  View buildIndicator(Tab tab){View view =mInflater.inflate(R.layout.tab_indicator,null);ImageView img = (ImageView) view.findViewById(R.id.icon_tab);TextView text = (TextView) view.findViewById(R.id.txt_indicator);img.setBackgroundResource(tab.getIcon());text.setText(tab.getTitle());return  view;}复制代码

自定义类

/*** Created by monkey* on 2014/9/24* 功能描述:修改过的FragmentTabHost,保存fragment实例不销毁*/
/** 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.*/import java.util.ArrayList;import android.content.Context;import android.content.res.TypedArray;import android.os.Bundle;import android.os.Parcel;import android.os.Parcelable;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentManager;import android.support.v4.app.FragmentTransaction;import android.util.AttributeSet;import android.view.View;import android.view.ViewGroup;import android.widget.FrameLayout;import android.widget.LinearLayout;import android.widget.TabHost;import android.widget.TabWidget;/*** 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 FragmentTabHost extends TabHost implementsTabHost.OnTabChangeListener {private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();private FrameLayout mRealTabContent;private Context mContext;private FragmentManager mFragmentManager;private int mContainerId;private 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 TabContentFactory {private final Context mContext;public DummyTabFactory(Context context) {mContext = context;}@Overridepublic 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();}@Overridepublic void writeToParcel(Parcel out, int flags) {super.writeToParcel(out, flags);out.writeString(curTab);}@Overridepublic String toString() {return "FragmentTabHost.SavedState{"+ Integer.toHexString(System.identityHashCode(this))+ " curTab=" + curTab + "}";}public static final Creator<SavedState> CREATOR = new Creator<SavedState>() {public SavedState createFromParcel(Parcel in) {return new SavedState(in);}public SavedState[] newArray(int size) {return new SavedState[size];}};}public FragmentTabHost(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 FragmentTabHost(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 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@Deprecatedpublic 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);}}}@Overridepublic void setOnTabChangedListener(OnTabChangeListener l) {mOnTabChangeListener = l;}public void addTab(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);}@Overrideprotected 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.commitAllowingStateLoss();mFragmentManager.executePendingTransactions();}}@Overrideprotected void onDetachedFromWindow() {super.onDetachedFromWindow();mAttached = false;}@Overrideprotected Parcelable onSaveInstanceState() {Parcelable superState = super.onSaveInstanceState();SavedState ss = new SavedState(superState);ss.curTab = getCurrentTabTag();return ss;}@Overrideprotected void onRestoreInstanceState(Parcelable state) {SavedState ss = (SavedState) state;super.onRestoreInstanceState(ss.getSuperState());setCurrentTabByTag(ss.curTab);}@Overridepublic 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;}
}
复制代码

七、【应用的主要框架】相关推荐

  1. Ethercat解析(七)之主站框架

    下图为完整的主站框架图: 对于主站驱动来说,一个驱动可以生成多个主站,具体驱动加载方法为: 加载方法: 加载一个主站,则为: insmod ec_master main_devices=00:0E:0 ...

  2. nginx学习笔记七(nginx HTTP框架的执行流程)

    之前已经介绍过nginx的事件框架.那么,对于client发出的一个http的请求,nginx的http框架是如何一步步解析这个http请求?http框架又是如何和之前介绍过得epoll事件模块结合起 ...

  3. 第七讲:flask框架

    python之flask框架: flask图标 简介 Flask是一个轻量级的基于Python的web框架. Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活.轻 ...

  4. 一起来学SpringBoot(七)持久层框架

    springboot具有非常棒的持久层框架支持,下面我将介绍我用过的三种持久层框架进行简述使用. 由于这里操作的都是一张表,这里贴出通用的yml和建表语句 切记这里使用的是mysql8 ,5.8之前的 ...

  5. Big Data(七)MapReduce计算框架(PPT截图)

    一.为什么叫MapReduce? Map是以一条记录为单位映射 Reduce是分组计算 转载于:https://www.cnblogs.com/littlepage/p/11156617.html

  6. easyui框架前后端交互_Vue+ElementUI+.netcore前后端分离框架开发项目实战

    点击上方"前端教程",选择"星标" 每天前端开发干货第一时间送达! 转自:我心依旧.cnblogs.com/-clouds/p/11633786.html 框架 ...

  7. PMBOK第七版,通往项目管理的新地图

    PMP(项目管理专业资格人士认证)认证领域喊了近2年的改版,这次终于来了!!!作为光环教研团队,从PMI(美国项目管理协会)2019年中旬首次发布新考纲以来,我们一直保持对于改版的密切关注和研究,期间 ...

  8. “七层架构”-----实践篇-登录小实例

    上一篇博客小编简单介绍了一下近期在软件开发过程中由三层架构演变而来的"七层架构"基本理论点.理论知识与产生结果之间还夹杂着一个重要的点---实践.用实践来检验理论知识,丰富知识内涵 ...

  9. python接口测试_Python接口自动化测试框架实战开发(一)

    目录 一丶叙述 二丶接口基础知识 三丶接口测试工具 四丶Fiddler的使用 五丶unittest使用 六丶mock服务入门到实战 七丶接口自动化框架设计到开发 一丶叙述 1.项目介绍 整个项目分为四 ...

  10. framebuffer驱动详解2——framebuffer驱动框架分析

    以下内容源于朱有鹏嵌入式课程的学习,如有侵权,请告知删除. 一.framebuffer驱动框架总览 1.驱动框架部分 (1)drivers/video/fbmem.c(主要的文件) 创建graphic ...

最新文章

  1. 远程连接MySQL慢的原因及解决
  2. linux bash中too many arguments问题的解决方法
  3. Java读取propertise配置文件_JAVA读取PROPERTIES配置文件
  4. 全球及中国抓紧器行业十四五发展态势及前景规划建议报告2021-2027年版
  5. 初识Frida--Android逆向之Java层hook (一)
  6. boost::hana::is_disjoint用法的测试程序
  7. 12.1 Bootstrap介绍
  8. 一行 Python 代码轻松构建树状热力图
  9. 查看mysql数据用户权限_查看MYSQL数据库中所有用户及拥有权限
  10. 6阶群的非平凡子群_离散数学复习笔记
  11. 河北省计算机2018单招试题答案,2018年河北省普通高职单招考试十类和高职单招对口电子电工类、计算机类联考命题、考试与评卷...
  12. 机器学习分类算法_Python机器学习之K近邻分类算法(四)
  13. 我有几个粽子,和一个故事
  14. idea redis 插件_Redis客户端RDM收费后,还有那些开源的替代品呢?
  15. 将[ESRI中国社区-GIS大讲堂]中Jueery关于ArcGIS Server的帖子内容整理成PDF发上来
  16. 计算机网络技术该考什么证,计算机网络工程师证书
  17. python美化excel_Python 使用 prettytable 库打印表格(美化输出)
  18. 【OpenCV】- 图像修复
  19. ios 开发中遇到的一些问题
  20. python做马尔科夫模型预测法_李航《统计学习方法》第十章——用Python实现隐马尔科夫模型...

热门文章

  1. 杨建:网站加速--系统架构篇
  2. C++多线程Demo
  3. FoundationDB 开源文档数据库模型 Document Layer​​​​​​​
  4. 智能门禁考勤机:刷脸同时开门和打卡
  5. 百科知识 已知三角形三条边长,如何求解三角形的面积
  6. LAMP_PHP配置
  7. IDEA快捷键整理(最详细的)
  8. AppStore上传已经开发好的App的方法
  9. ASM磁盘超过disk_repair_time导致磁盘状态为forcing
  10. android实现简单的聊天室