服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - Android中使用TabHost 与 Fragment 制作页面切换效果

Android中使用TabHost 与 Fragment 制作页面切换效果

2021-06-24 13:28RustFisher Android

这篇文章主要介绍了Android中使用TabHost 与 Fragment 制作页面切换效果的相关资料,需要的朋友可以参考下

三个标签页置于顶端

效果图:

 

在文件boardtabhost.java中定义页面切换的效果;切换页面时,当前页面滑出,目标页面滑入。这是2个不同的动画设定动画时要区分对待

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import android.content.context;
import android.util.attributeset;
import android.view.animation.animation;
import android.view.animation.translateanimation;
import android.widget.tabhost;
public class boardtabhost extends tabhost {
private int currenttab = 0;
int duration = 1000;// ms; the bigger the slower
public boardtabhost(context context) {
super(context);
}
public boardtabhost(context context, attributeset attr) {
super(context, attr);
}
@override
public void setcurrenttab(int index) {
// we need two animation here: first one is fading animation, 2nd one is coming animation
// translateanimation of fading fragment
if (index > currenttab) {// fly right to left and leave the screen
translateanimation translateanimation = new translateanimation(
animation.relative_to_self/* fromxtype */, 0f/* fromxvalue */,
animation.relative_to_self/* toxtype */, -1.0f/* toxvalue */,
animation.relative_to_self, 0f,
animation.relative_to_self, 0f
);
translateanimation.setduration(duration);
getcurrentview().startanimation(translateanimation);
} else if (index < currenttab) {// fly left to right
translateanimation translateanimation = new translateanimation(
animation.relative_to_self, 0f,
animation.relative_to_self, 1.0f,
animation.relative_to_self, 0f,
animation.relative_to_self, 0f
);
translateanimation.setduration(duration);
getcurrentview().startanimation(translateanimation);
}
super.setcurrenttab(index);// the current tab is index now
// translateanimation of adding fragment
if (index > currenttab) {
translateanimation translateanimation = new translateanimation(
animation.relative_to_parent, 1.0f,/* fly into screen */
animation.relative_to_parent, 0f, /* screen location */
animation.relative_to_parent, 0f,
animation.relative_to_parent, 0f
);
translateanimation.setduration(duration);
getcurrentview().startanimation(translateanimation);
} else if (index < currenttab) {
translateanimation translateanimation = new translateanimation(
animation.relative_to_parent, -1.0f,
animation.relative_to_parent, 0f,
animation.relative_to_parent, 0f,
animation.relative_to_parent, 0f
);
translateanimation.setduration(duration);
getcurrentview().startanimation(translateanimation);
}
currenttab = index;
}
}

对应的布局文件activity_board.xml

使用boardtabhost,装载一个竖直的linearlayout;上面是tabwidget,装载标签;后面是fragment的framelayout
可以看到这里有3个fragment,待会在activity中也设置3个标签

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?xml version="1.0" encoding="utf-8"?>
<com.rust.tabhostdemo.boardtabhost
android:id="@android:id/tabhost"
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"
tools:context="com.rust.tabhostdemo.boardactivity">
<linearlayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<tabwidget
android:id="@android:id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<framelayout
android:id="@android:id/tabcontent"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/fragment_tab1"
android:name="com.rust.tabhostdemo.tabfragment1"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<fragment
android:id="@+id/fragment_tab2"
android:name="com.rust.tabhostdemo.tabfragment2"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<fragment
android:id="@+id/fragment_tab3"
android:name="com.rust.tabhostdemo.tabfragment3"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</framelayout>
</linearlayout>
</com.rust.tabhostdemo.boardtabhost>

值得一提的是,这里的id要用android指定的id;
比如@android:id/tabhost,@android:id/tabcontent,@android:id/tabs;否则系统找不到对应控件而报错

boardactivity.java中设置了3个标签页,并指定了标签对应的fragment

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import android.support.v4.app.fragmentactivity;
import android.os.bundle;
public class boardactivity extends fragmentactivity {
public static final string tab1 = "tab1";
public static final string tab2 = "tab2";
public static final string tab3 = "tab3";
public static boardtabhost boardtabhost;
@override
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.activity_board);
boardtabhost = (boardtabhost) findviewbyid(android.r.id.tabhost);
boardtabhost.setup();
boardtabhost.addtab(boardtabhost.newtabspec(tab1).setindicator(getstring(r.string.tab1_name))
.setcontent(r.id.fragment_tab1));
boardtabhost.addtab(boardtabhost.newtabspec(tab2).setindicator(getstring(r.string.tab2_name))
.setcontent(r.id.fragment_tab2));
boardtabhost.addtab(boardtabhost.newtabspec(tab3).setindicator(getstring(r.string.tab3_name))
.setcontent(r.id.fragment_tab3));
boardtabhost.setcurrenttab(0);
}
}

主要文件目录:

── layout

├── activity_board.xml
├── fragment_tab1.xml
├── fragment_tab2.xml
└── fragment_tab3.xml

── tabhostdemo

├── boardactivity.java
├── boardtabhost.java
├── tabfragment1.java
├── tabfragment2.java
└── tabfragment3.java

以上所述是小编给大家介绍的android中使用tabhost 与 fragment 制作页面切换效果的相关内容,希望对大家有所帮助!

延伸 · 阅读

精彩推荐
  • AndroidAndroid中AsyncTask详细介绍

    Android中AsyncTask详细介绍

    这篇文章主要介绍了Android中AsyncTask详细介绍,AsyncTask是一个很常用的API,尤其异步处理数据并将数据应用到视图的操作场合,需要的朋友可以参考下...

    Android开发网7452021-03-11
  • Android汇总Android视频录制中常见问题

    汇总Android视频录制中常见问题

    这篇文章主要汇总了Android视频录制中常见问题,帮助大家更好地解决Android视频录制中常见的问题,需要的朋友可以参考下...

    yh_thu5192021-04-28
  • AndroidAndroid界面效果UI开发资料汇总(附资料包)

    Android界面效果UI开发资料汇总(附资料包)

    android ui界面设计,友好的界面会提高用户体验度;同时也增强了android ui界面设计的难度,本文提供了一些常用开发资料(有下载哦)感兴趣的朋友可以了解下...

    Android开发网4672021-01-03
  • AndroidAndroid编程解析XML方法详解(SAX,DOM与PULL)

    Android编程解析XML方法详解(SAX,DOM与PULL)

    这篇文章主要介绍了Android编程解析XML方法,结合实例形式详细分析了Android解析XML文件的常用方法与相关实现技巧,需要的朋友可以参考下...

    liuhe68810052021-05-03
  • AndroidAndroid CardView+ViewPager实现ViewPager翻页动画的方法

    Android CardView+ViewPager实现ViewPager翻页动画的方法

    本篇文章主要介绍了Android CardView+ViewPager实现ViewPager翻页动画的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    Abby代黎明9602022-03-02
  • AndroidAndroid实现固定屏幕显示的方法

    Android实现固定屏幕显示的方法

    这篇文章主要介绍了Android实现固定屏幕显示的方法,实例分析了Android屏幕固定显示所涉及的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    鉴客6192021-03-27
  • AndroidAndroid实现Service获取当前位置(GPS+基站)的方法

    Android实现Service获取当前位置(GPS+基站)的方法

    这篇文章主要介绍了Android实现Service获取当前位置(GPS+基站)的方法,较为详细的分析了Service基于GPS位置的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    Ruthless8342021-03-31
  • AndroidAndroid程序设计之AIDL实例详解

    Android程序设计之AIDL实例详解

    这篇文章主要介绍了Android程序设计的AIDL,以一个完整实例的形式较为详细的讲述了AIDL的原理及实现方法,需要的朋友可以参考下...

    Android开发网4642021-03-09