Android - FragmentTabHost 与 Fragment 制作页面切换效果
使用 FragmentTabHost 与 Fragment 制作页面切换效果
API 19
TabHost已经不建议使用了。用 FragmentTabHost 来代替TabHost。实际上 FragmentTabHost 继承自 TabHost
效果图:

主文件是FragmentTabHostDemo.java
- 继承自FragmentActivity;
- 设置3个底部标签,自定义了标签切换时的标签变化;
- 添加标签页有多种方式,每个标签页对应一个fragment
- 每次切换fragment,都会调用fragment的
onCreateView()和onResume()方法; - v4包使用
getSupportFragmentManager(); - 动态加载fragment,不用在xml中注册;
- 其他的大体和TabHost一样;比如xml文件中的id要用android指定的id;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTabHost;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.TabHost;
import android.widget.TextView;
import com.rust.aboutview.fragment.TabFragment1;
import com.rust.aboutview.fragment.TabFragment2;
import com.rust.aboutview.fragment.TabFragment3;
import java.util.HashMap;
public class FragmentTabHostDemo extends FragmentActivity {
public static final int COLOR_GRAY_01 = 0xFFADADAD; //自定义的颜色
public static final int COLOR_GREEN_01 = 0xFF73BF00;
public static final String TAB1 = "tab1";
public static final String TAB2 = "tab2";
public static final String TAB3 = "tab3";
public static final String TABS[] = {TAB1, TAB2, TAB3};
public static HashMap<String, Integer> mTabMap;
public static FragmentTabHost mTabHost;
LayoutInflater mLayoutInflater;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment_tab_host);
mTabMap = new HashMap<>();
mTabMap.put(TAB1, 0);
mTabMap.put(TAB2, 1);
mTabMap.put(TAB3, 2);
mLayoutInflater = LayoutInflater.from(getApplicationContext());
mTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);
mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);
mTabHost.getTabWidget().setMinimumHeight(120);// 设置tab的高度
mTabHost.getTabWidget().setDividerDrawable(null);
TabHost.TabSpec tabSpec = mTabHost.newTabSpec(TABS[0]);
View tabView1 = mLayoutInflater.inflate(R.layout.tab_item, null);
final ImageView tabImage1 = (ImageView) tabView1.findViewById(R.id.tab_image);
final TextView tabText1 = (TextView) tabView1.findViewById(R.id.tab_text);
tabImage1.setImageResource(R.drawable.a4a);
tabText1.setText(getString(R.string.tab_label_1));
tabText1.setTextColor(COLOR_GREEN_01);
tabSpec.setIndicator(tabView1);
mTabHost.addTab(tabSpec, TabFragment1.class, null);
View tabView2 = mLayoutInflater.inflate(R.layout.tab_item, null);
final ImageView tabImage2 = (ImageView) tabView2.findViewById(R.id.tab_image);
tabImage2.setImageResource(R.drawable.a49);
final TextView tabText2 = (TextView) tabView2.findViewById(R.id.tab_text);
tabText2.setText(getString(R.string.tab_label_2));
mTabHost.addTab(mTabHost.newTabSpec(TABS[1]).setIndicator(tabView2),
TabFragment2.class, null);
View tabView3 = mLayoutInflater.inflate(R.layout.tab_item, null);
final ImageView tabImage3 = (ImageView) tabView3.findViewById(R.id.tab_image);
tabImage3.setImageResource(R.drawable.a49);
final TextView tabText3 = (TextView) tabView3.findViewById(R.id.tab_text);
tabText3.setText(getString(R.string.tab_label_3));
mTabHost.addTab(mTabHost.newTabSpec(TABS[2])
.setIndicator(tabView3), TabFragment3.class, null);
mTabHost.setCurrentTab(0);
mTabHost.setOnTabChangedListener(new TabHost.OnTabChangeListener() {
@Override
public void onTabChanged(String tabId) {
int child = mTabMap.get(tabId);
tabImage1.setImageResource(R.drawable.a49);
tabImage2.setImageResource(R.drawable.a49);
tabImage3.setImageResource(R.drawable.a49);
tabText1.setTextColor(COLOR_GRAY_01);
tabText2.setTextColor(COLOR_GRAY_01);
tabText3.setTextColor(COLOR_GRAY_01);
switch (child) {
case 0:
tabImage1.setImageResource(R.drawable.a4a);
tabText1.setTextColor(COLOR_GREEN_01);
break;
case 1:
tabImage2.setImageResource(R.drawable.a4a);
tabText2.setTextColor(COLOR_GREEN_01);
break;
case 2:
tabImage3.setImageResource(R.drawable.a4a);
tabText3.setTextColor(COLOR_GREEN_01);
break;
}
}
});
}
}
activity_fragment_tab_host.xml,使用FragmentTabHost;
标签放在页面底部;注意这里的id,以及layout的宽高设置
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<FrameLayout
android:id="@+id/realtabcontent"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1" />
<android.support.v4.app.FragmentTabHost
android:id="@android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@color/colorYellow01">
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="0" />
</android.support.v4.app.FragmentTabHost>
</LinearLayout>
因为切换标签时会重载fragment,可以在fragment中判断一下,已经加载过的,不需要重新加载;
TabFragment1.java 中定义了一个rootView
public class TabFragment1 extends Fragment {
private View rootView;// cache fragment view
TextView centerTV;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Log.d("rust", "TabFragment1 onCreateView");
if (rootView == null) {
rootView = inflater.inflate(R.layout.fragment_tab1, null);
}
ViewGroup parent = (ViewGroup) rootView.getParent();
// if root view had a parent, remove it.
if (parent != null) {
parent.removeView(rootView);
}
centerTV = (TextView) rootView.findViewById(R.id.center_tv);
centerTV.setOnClickListener(new View.OnClickListener() {
// @Override
public void onClick(View v) {
centerTV.setText(String.format("%s","Tab1 clicked"));
centerTV.setTextColor(Color.BLACK);
}
});
return rootView;
}
@Override
public void onResume() {
super.onResume();
Log.d("rust", "TabFragment1 onResume");
}
}
已点击的效果图:

Android - FragmentTabHost 与 Fragment 制作页面切换效果的更多相关文章
- Android - TabHost 与 Fragment 制作页面切换效果
Android - TabHost 与 Fragment 制作页面切换效果 Android API 19 , API 23 三个标签页置于顶端 效果图: 在文件BoardTabHost.java中定义 ...
- 【CSS3】纯CSS3制作页面切换效果
此前写的那个太复杂了,来点简单的核心 <html> <head> <title></title> <style type="text/c ...
- 使用ViewPager+Fragment实现选项卡切换效果
实现效果 本实例主要实现用ViewPage和Fragment实现选项卡切换效果,选项卡个数为3个,点击选项卡或滑动屏幕会切换Fragment并实现选项卡下方下边框条跟随移动效果. 本程序用androi ...
- jquery mobile页面切换效果(Flip toggle switch)(注:jQuery移动使用的数据属性的列表。 )
1.页面切换(data-transition)
- html5各种页面切换效果和模态对话框
页面动画:data-transition 属性可以定义页面切换是的动画效果.例如:<a href="index.html" data-transition="pop ...
- 基于html5和css3响应式全屏滚动页面切换效果
分享一款全屏响应式的HTML5和CSS3页面切换效果.这个页面布局效果对于那些页面要求固定100%高度和宽度的网站和APP来说是十分有用的.效果图如下: 在线预览 源码下载 HTML wrappe ...
- WP8 NavigationInTransition实现页面切换效果
NavigationInTransition这个是实现页面切换效果,而且没控件来拖,要自己手动写, 将App.xaml.cs中InitializePhoneApplication()函数里的RootF ...
- 在uwp仿IOS的页面切换效果
有时候我们需要编写一些迎合IOS用户使用习惯的uwp应用,我在这里整理一下仿IOS页面切换效果的代码. 先分析IOS的页面切换.用户使用左右滑动方式进行前进和后退,播放类似于FlipView的切换动画 ...
- [Swift通天遁地]九、拔剑吧-(7)创建旋转和弹性的页面切换效果
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
随机推荐
- DFS and BFS
DFS https://github.com/Premiumlab/Python-for-Algorithms--Data-Structures--and-Interviews/blob/master ...
- 怎么一次性获取form所有的值?rerialize() 、 serializeArray()方法的使用
from直接提交当然方便,但是有时候需要对数据进行处理再用ajax提交,挨个去获取值未免太麻烦,讲两个一次性获取所有值的方法. 方法1 $("form").serialize(); ...
- APUE-文件和目录(三)函数chown 和lchown
下面的几个chown函数可用于更改文件的用户ID和组ID.如果两个参数owner或group中的任意一个是-1,则对应的ID不变. #include<unistd.h> int chown ...
- Vue.js 运行环境搭建详解(基于windows的手把手安装教学)及vue、node基础知识普及
Vue.js 是一套构建用户界面的渐进式框架.他自身不是一个全能框架——只聚焦于视图层.因此它非常容易学习,非常容易与其它库或已有项目整合.在与相关工具和支持库一起使用时,Vue.js 也能完美地驱动 ...
- Spring+SpringMVC+MyBatis深入学习及搭建(十二)——SpringMVC入门程序
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6999743.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十一)--S ...
- Shiro眼皮下玩ajax,玩出302 Found(实践得经验)
2017/06/14这一天,是我玩Shiro安全框架最刻骨铭心的一天.因为Shiro今天给我深深的补了一刀,在这儿我也给各位补一刀吧,其实问题很简单,解决方式也极其简单,只是给各位分享一下这个错误,纯 ...
- gradle 使用总结
什么是gradle 书面化解释: Gradle可以自动化地进行软件构建.测试.发布.部署.软件打包,同时也可以完成项目相关功能如:生成静态网站.生成文档等. Gradle是一种依赖管理工具. 它和ma ...
- MATLAB仿真中连续和离散的控制器有何区别?
matlab系统同时提供连续和离散的控制器和对象的目的是:在降低用户使用复杂程度的同时提高仿真精度.仿真速度和应用的广泛性. 仿真步长和求解精度的概念对于理解这个问题至关重要. 首先是步长,步长和求解 ...
- spring4 之 helloworld
1.从官网下载相关JAR包 spring-framework-4.2.1.RELEASE-dist(下载地址:http://maven.springframework.org/release/org/ ...
- Linux回炉复习系列文章大纲
本人最近在回炉Linux的内容,也做了很多整理,顺便也想将整理的内容分享出来. 由于该系列文章的内容主要是复习整理而来,其中绝大多数命令都是翻译和整理man或info文档总结的,另外很多地方也没有给出 ...