androidtabhost缓存_FragmentTabHost布局的使用及优化方式

欢迎Follow我的GitHub, 关注我的简书. 其余参考Android目录.

TabHost

Android

FragmentTabHost作为Android4.0版本的控件, 已经被项目广泛使用, 5.0版本又推出TabLayout+ViewPager显示多页. 我来讲解如何使用FragmentTabHost.

本文源码的GitHub下载地址

主要包括:

(1) 自定义Tab的图片资源和去掉分割线.

(2) 缓存Fragment的布局, 减少填充.

在切换页面时, 控件会调用Fragment的onCreateView, 重新创建页面.

通过缓存页面, 可以增强性能.

1. 布局

FragmentTabHost是原生控件, 并不需要添加其他的maven库.

包括标签组Tabs和页面TabContainer, 标签组固定大小, 页面填充.

android:id="@android:id/tabhost"

xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent">

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

android:id="@android:id/tabs"

android:layout_width="match_parent"

android:layout_height="?attr/actionBarSize"

android:layout_gravity="bottom"/>

android:id="@android:id/tabcontent"

android:layout_width="match_parent"

android:layout_height="0dp"

android:layout_weight="1"/>

注意控件的id必须是Android提供的标准id, 即”@android:id”.

Fragment布局, 包含一行文字提示.

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

android:id="@+id/tab_tv_text"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:gravity="center"

android:textSize="40sp"

tools:text="Test"/>

Tab布局, 包含一个图片控件.

xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:orientation="vertical">

android:id="@+id/tab_iv_image"

android:padding="12dp"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:contentDescription="@null"

tools:src="@drawable/tab_assistant"/>

2. 主页

setup设置页面组合, 却掉分割线etDividerDrawable(null), 设置Tab.

使用自定义的图片资源, newTabSpec设置Fragment的Tag标签.

/**

* 主页, 切换Tab标签显示不同页面.

*

* @author C.L.Wang

*/

public class MainActivity extends AppCompatActivity {

@Bind(android.R.id.tabhost) FragmentTabHost mTabHost;

// 图片

@DrawableRes

private int mImages[] = {

R.drawable.tab_counter,

R.drawable.tab_assistant,

R.drawable.tab_contest,

R.drawable.tab_center

};

// 标题

private String mFragmentTags[] = {

"counter",

"assistant",

"contest",

"center"

};

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

ButterKnife.bind(this);

mTabHost.setup(this, getSupportFragmentManager(), android.R.id.tabcontent);

mTabHost.getTabWidget().setDividerDrawable(null); // 去掉分割线

for (int i = 0; i < mImages.length; i++) {

// Tab按钮添加文字和图片

TabHost.TabSpec tabSpec = mTabHost.newTabSpec(mFragmentTags[i]).setIndicator(getImageView(i));

// 添加Fragment

mTabHost.addTab(tabSpec, FragmentTab.class, null);

// 设置Tab按钮的背景

mTabHost.getTabWidget().getChildAt(i).setBackgroundResource(R.color.pedo_actionbar_bkg);

}

}

// 获得图片资源

private View getImageView(int index) {

@SuppressLint("InflateParams")

View view = getLayoutInflater().inflate(R.layout.view_tab_indicator, null);

ImageView imageView = (ImageView) view.findViewById(R.id.tab_iv_image);

imageView.setImageResource(mImages[index]);

return view;

}

}

3. 切换页

显示不同Tag标签. 缓存页面, 注意关联前, 删除父控件关联. 页面显示Tag信息.

/**

* Tab的Fragment

*

* Created by wangchenlong on 15/12/28.

*/

public class FragmentTab extends Fragment {

@Bind(R.id.tab_tv_text) TextView mTvText;

private View mViewContent; // 缓存视图内容

@Nullable @Override

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

if (mViewContent == null) {

mViewContent = inflater.inflate(R.layout.fragment_tab, container, false);

}

// 缓存View判断是否含有parent, 如果有需要从parent删除, 否则发生已有parent的错误.

ViewGroup parent = (ViewGroup) mViewContent.getParent();

if (parent != null) {

parent.removeView(mViewContent);

}

ButterKnife.bind(this, mViewContent);

return mViewContent;

}

@Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {

super.onViewCreated(view, savedInstanceState);

// 显示Fragment的Tag信息

mTvText.setText(String.valueOf("Page: " + getTag()));

}

@Override public void onDestroyView() {

super.onDestroyView();

ButterKnife.unbind(this);

}

}

动画

熟练使用控件很重要.

OK, That’s all! Enjoy It!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332020.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二叉查找树

【0】README 0.1&#xff09;本文的重点在于介绍 二叉查找树的概念&#xff0c;以及写出 二叉查找树的操作例程的源代码&#xff0c; 其中当属delete 操作的源代码最不容易实现&#xff1b; 0.2&#xff09;本文源代码均为原创&#xff0c; 当然 代码中的idea 是借鉴人家的&a…

常用的命名规范/命名规则

文章目录骆驼式命名法&#xff08;CamelCase&#xff09;帕斯卡命名法&#xff08;PascalCase&#xff09;串式命名法&#xff08;KebabCase&#xff09;下划线命名法&#xff08;UnderScoreCase&#xff09;骆驼式命名法&#xff08;CamelCase&#xff09; 也叫小驼峰式命名法…

spring order_Spring @Order批注

spring order介绍&#xff1a; Spring Order注释是在Spring 2.0中首次引入的。 然后&#xff0c;它仅用于定义AspectJ建议中的顺序。 在Spring 4.0的后面&#xff0c;对该注释的实现进行了进一步改进。 从那时起&#xff0c;它还支持对Java数组或List之类的集合中的Spring组件或…

AVL树

【0】README 0.1&#xff09;本文给出了平衡二叉树&#xff08;AVL树&#xff09;的插入例程涉及到的单旋转双旋转的概念&#xff0c;并给出了代码实现&#xff1b; 0.2&#xff09;本文源代码均为原创&#xff0c; 当然相关idea 还是借鉴人家的&#xff1b;&#xff08;真心…

spring 注释_Spring@懒惰注释

spring 注释介绍&#xff1a; 默认情况下&#xff0c; Spring框架在应用程序启动时加载并热切初始化所有bean。 在我们的应用程序中&#xff0c;我们可能有一些非常消耗资源的bean。 我们宁愿根据需要加载此类bean。 我们可以使用Spring Lazy批注实现此目的 。 在本教程中&…

管理系统的账户设计(涉及注册/登录逻辑)

文章目录方案一方案二方案三方案一 类似华为云IAM&#xff08;Identity and Access Management 身份和访问管理&#xff09;用户&#xff0c;阿里云的 RAM&#xff08;Resource Access Management 资源访问管理&#xff09;用户 机构有独立的账户&#xff08;主账户&#xff…

opencv生成日志_OpenCV-Utils学习日志:VideoCapture使用样例

1.VideoCapture可以打开多种来源的数据流&#xff0c;但常见的是相机、视频及图像序列三类数据流&#xff1a;(1)打开相机数据流&#xff0c;需要指定相机在主机上的设备编号&#xff0c;若主机上只有一个相机则编号通常是0。(2)打开视频数据流&#xff0c;需要指定视频的完整路…

jdbc查询序列_JDBC –模拟序列

jdbc查询序列也许我们每个人在程序员的生活中至少遇到过一次这个问题- 如何模拟数据库序列&#xff1f; 在下面&#xff0c;您可能会发现我对该问题解决方案的各种了解。 假设我们有一个接口定义了所需的API&#xff0c;用于返回整数序列&#xff1a; public interface Sequen…

利用 GregorianCalendar 制作当前月的月历

【0】README 0.1&#xff09;本文文字总结于 core java volume 1 &#xff0c; 源代码均为原创&#xff1b; 0.2&#xff09;本文旨在熟悉 GregorianCalendar 日历类&#xff0c;每一天就是一个GregorianCalendar 日历类&#xff0c;一天有很多的日历属性&#xff0c;觉得用它…

pyecharts怎么绘制散点图_PyeCharts绘制各种图形

简介PyeCharts 是一个用于生成 Echarts 图表的类库&#xff0c;用其生成的图可视化效果非常棒&#xff0c;而且使用起来非常简单。下面是一些常用图的pyecharts实现方法柱状图bar pye.Bar("柱状图")#新建柱状图bar.add("服装", #图例名称["衬衫"…

junit junit_穿越JUnit流

junit junit关于JUnit 5迁移的好处之一是&#xff0c;您可以在老式模式下运行JUnit 4测试&#xff0c;并且所有内容仍然兼容。 不利的一面是&#xff0c;某些注释和方法在JUnit 4和JUnit 5中具有相同的名称&#xff0c;并且当两组库依赖项都可用时&#xff0c;很容易导入错误的…

被遗忘的软件产品形态

从2010年以后&#xff0c;很多公司开发的软件产品&#xff0c;很少有客户端了&#xff0c;web2.0之后&#xff0c;主流的业务系统基本上都是基于Web去构建业务系统。这几年见到的业务应用系统都是基于Web的构建的。而在To C市场&#xff0c;几乎就没有客户端了&#xff0c;都是…

vue进行判断使用class_vue判断dom的class

vue点击给dom添加class然后获取含有class的dom{{item.name}}{{item2.name}}jschek(index2, index) {this.iac[index2] indexthis.iac this.iac.concat([]);this.checkchose()},checkchose:function(){var chosethisvar chosedomchose.$refs.choseboxconsole.log(chosedom)for…

方法参数的值调用+引用调用+深浅拷贝

【0】README 0.1&#xff09;本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理清值调用引用调用&#xff1b; 【1】参数传递给方法的专业术语&#xff1a; 1.1&#xff09;值调用&#xff1a;它表示方法接收的是调用者提供的值&#xff1b; 1.2&#xff09;引用…

设计模式 工厂方法_工厂方法设计模式

设计模式 工厂方法工厂方法模式是流行的创作设计模式之一。 它并不特别依赖于工厂对象来创建对象。 而是要在同一类中使用单独的方法来创建对象。 Factory Method模式定义了一个用于创建对象的接口&#xff0c;但是让子类决定如何实例化其对象。 每个子类必须定义其Factory方法…

靖江机器人怎么样_铁饭碗不保?靖江可能消失的12大职业!快看有你的工作没?...

原标题&#xff1a;铁饭碗不保&#xff1f;靖江可能消失的12大职业&#xff01;快看有你的工作没&#xff1f;无人飞机、无人驾驶、智能机器人....你能想象这些充满现代感的高科技正在改变我们的生活吗&#xff1f;在科技高速发展的今天人工智能逐渐能够代替人类的部分工作但&a…

MarkdownPad 汉化破解(含下载地址)

转自 http://jingyan.baidu.com/article/ca41422fe209271eaf99ed7c.html MarkdownPad是一个全功能Markdown编辑器的Windows。 【1】MarkdownPad 汉化破解&#xff08;含下载地址&#xff09; 工具/原料 MarkdownPad 2.4 方法/步骤 软件 下载地址&#xff08;本软件为绿色版…

捡对象引流脚本 内容_对象和索引流

捡对象引流脚本 内容我本来要写一篇关于如何将流与每个元素的索引混合的文章&#xff0c;但是Baeldung上的人们已经很好地涵盖了这个主题 &#xff01; 鉴于我是他们编辑团队的一员&#xff0c;我为他们/我们感到自豪。 有趣的是&#xff0c;特别是Streams中的Java函数式编程如…

散列之再散列

【0】README 0.1&#xff09;本文描述总结于 数据结构与算法分析&#xff0c; 但源代码为原创&#xff1b; 0.2&#xff09;为什么写这篇博文&#xff1f; 再散列的代码实现 包括了 解决冲突的方法实现&#xff1b;很有代表性&#xff1b;&#xff08;本源代码采用的解决冲突…

激活策略 查询_5个提问,详细介绍北极星指标的策略框架

北极星指标&#xff08;North Star Metric&#xff09;已经逐渐成为许多公司指导产品发展的重要指标&#xff0c;本文通过五个设问和多个行业案例&#xff0c;系统性地介绍北极星指标这类产品策略框架。如今有非常多的人在谈论和使用北极星指标&#xff08;North Star Metric&a…