利用TabHost制作QQ客户端标签栏效果(低版本QQ)
学习一定要从基础学起,只有有一个好的基础,我们才会变得更加的perfect
下面小编将利用TabHost制作QQ客户端标签栏效果(这个版本的QQ是在前几年发布的)….
首先我们看一下效果:

看到这个界面,刹那间一点喜悦感都没有了,不过对于我们学习程序的人来说,UI是一方面,代码也是一方面,今天讲述的是代码,所以我们就在此忽略UI吧
--------------------------------------------------------华丽分割线---------------------------------------
【分析】
1)界面中含有一个导航栏(这里叫做标签栏),每个栏目下面含有一个有ListView构成的页面
2)ListView中的item为自定义布局
3)自定义适配器
4)使用Intent进行信息的传递
5)使用TabHost进行页面间的切换
【代码】
注:由于三个页面中的内容样式基本相同,所以小编即拿好友页面予以讲述
1)创建一个activity_main(主布局)
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@android:id/tabhost"
android:layout_width="match_parent"
android:layout_height="match_parent"> <!--定义TabHost标签-->
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<!--定义TabWeidget控件-->
<TabWidget
android:id="@android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/> <!--定义FramLayout控件-->
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="5dp"/>
</LinearLayout>
</TabHost>
2)创建activity_myfriend,即有一个ListView组成的界面,此处省去
3)创建自定义样式activity_myfriend_item
<?xml version="1.0" encoding="utf-8"?>
<!--定义ListView的item样式-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"> <!--定义箭头图片-->
<ImageView
android:id="@+id/Iv"
android:layout_width="wrap_content"
android:layout_height="match_parent" /> <!--定义好友文字控件-->
<TextView
android:id="@+id/TvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="left"
android:layout_marginLeft="10dip"
android:textColor="@color/material_blue_grey_800"
android:textSize="20sp"/> <!--定义好友人数的文字控件--> <TextView
android:id="@+id/TvInfo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="right"
android:textColor="@color/material_blue_grey_800"
android:textSize="10sp"/>
</LinearLayout>
4)其他的两个页面和这个页面基本相同
5)创建实体类
package cn.edu.bzu.entity; /**
* Created by monster on 2015/4/15.
*/
public class MyFriend {
public String Name;
public int ImgId;
public String Info; public MyFriend(){
super();
}
public MyFriend(String name, int imgId, String info) {
super();
Name = name;
ImgId = imgId;
Info = info;
}
}
ps:此处的实体类主要是用作自定义适配器时使用
6)自定义适配器(重点)
自定义适配器可谓是ListView的一个重点
创建MyFriendListAdapter.java
package cn.edu.bzu.adapter; import android.content.Context;
import android.media.Image;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView; import java.util.ArrayList;
import java.util.List; import cn.edu.bzu.TabHost_QQ.R;
import cn.edu.bzu.entity.MyFriend; /**
* Created by monster on 2015/4/15.
*/
public class MyFriendListAdapter extends BaseAdapter { private Context context;
private List<MyFriend>list=new ArrayList<MyFriend>();
public MyFriendListAdapter(Context context, List<MyFriend> list) {
this.context = context;
this.list = list;
} class ViewHolder{
ImageView Image;
TextView Name;
TextView Info;
}
@Override
public int getCount() {
return list.size();
} @Override
public Object getItem(int position) {
return list.get(position);
} @Override
public long getItemId(int position) {
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if(convertView==null){
//初始化friend的item视图
convertView= LayoutInflater.from(context).inflate(R.layout.activity_myfriend_item,null);
viewHolder=new ViewHolder();
//获得视图中的对象控件
viewHolder.Image=(ImageView)convertView.findViewById(R.id.Iv);
viewHolder.Name=(TextView)convertView.findViewById(R.id.TvTitle);
viewHolder.Info=(TextView)convertView.findViewById(R.id.TvInfo);
convertView.setTag(viewHolder);
}else{
viewHolder=(ViewHolder)convertView.getTag();
}
//设置控件属性
viewHolder.Image.setBackgroundResource(list.get(position).ImgId);
viewHolder.Name.setText(list.get(position).Name);
viewHolder.Info.setText(list.get(position).Info);
return convertView;
}
}
7)创建MyFriendActivity.java
package cn.edu.bzu.TabHost_QQ; import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView; import java.util.ArrayList;
import java.util.List; import cn.edu.bzu.adapter.MyFriendListAdapter;
import cn.edu.bzu.entity.MyFriend; /**
* Created by monster on 2015/4/15.
*/
public class MyFriendActivity extends Activity {
private ListView LvFriend;
private List<MyFriend>list=new ArrayList<MyFriend>();
private MyFriendListAdapter adapter; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_myfriend);
getData(); //数据源
LvFriend=(ListView)findViewById(R.id.LvFriend);
adapter=new MyFriendListAdapter(MyFriendActivity.this,list);
LvFriend.setAdapter(adapter);
} private void getData() {
list.add(new MyFriend("在线好友",R.mipmap.arrow,"10"));
list.add(new MyFriend("同学好友",R.mipmap.arrow,"22"));
list.add(new MyFriend("工作好友",R.mipmap.arrow,"12"));
}
}
8)创建MainActivity.java
package cn.edu.bzu.TabHost_QQ; import android.app.TabActivity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TabHost; public class MainActivity extends TabActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TabHost tabHost=getTabHost();//调用当前activity中的tabHost对象
TabHost.TabSpec spec;//定义TabHost中的TabSpec对象
Intent i; /*
*设置第一个标签页布局
*/
i=new Intent(MainActivity.this,MyFriendActivity.class);
spec=tabHost.newTabSpec("0").setIndicator("好友").setContent(i);
tabHost.addTab(spec); /*
*设置第二个标签页布局
*/
i=new Intent(MainActivity.this,MyGroupActivity.class);
spec=tabHost.newTabSpec("1").setIndicator("群").setContent(i);
tabHost.addTab(spec); /*
*设置第三个标签页布局
*/
i=new Intent(MainActivity.this,MyDiscussionActivity.class);
spec=tabHost.newTabSpec("2").setIndicator("讨论组").setContent(i);
tabHost.addTab(spec); tabHost.setCurrentTab(0);//设置当前标签页
}
}
9)在AndroidManifest.xml注册Activity
10)大工高成
---------------------------------------------华丽分割线------------------------------------------------
ps:这个教程我们需要知道:
1)TabHost的使用,如何使用TabHost切换页面
2)自定义ListView的Item视图
3)如何通过继承BaseAdapter书写自定义适配器
4)在自定义适配器中如何获取数据源
5)自定义适配器各方法的含义
6)自定义适配器与实体类的使用
附录Github: https://github.com/monsterLin/tabhost_qq(项目使用的Android Stdio进行编写,下载请注意)
利用TabHost制作QQ客户端标签栏效果(低版本QQ)的更多相关文章
- 利用CSS3制作淡入淡出动画效果
CSS3新增动画属性“@-webkit-keyframes”,从字面就可以看出其含义——关键帧,这与Flash中的含义一致. 利用CSS3制作动画效果其原理与Flash一样,我们需要定义关键帧处的状态 ...
- C#利用API制作类似QQ一样的右下角弹出窗体
C#利用API制作类似QQ一样的右下角弹出窗体 (2009-03-21 15:02:49) 转载▼ 标签: 杂谈 分类: .NET using System;using System.Collecti ...
- 利用CSS制作图形效果
前言 关于如何使用CSS来制作图形,比如说圆形,半圆形,三角形等的相关教程还是挺多的,今天我主要想解释一下里面一些demo的实现原理,话不多说,开始吧 以下所有内容只使用一个HTML元素.任何类型 ...
- 3dmax利用静止静态对象功能,制作精准击碎效果
一般情况下,当我们在3D建模中使用RayFire破碎插件来制作一些精准击碎效果时,需要将物体的击中部分定义为休眠对象,将其他未击中的部分定义为静态对象,以实现击中部分出现碎片的效果.但这种方式必须精准 ...
- 利用 css 制作简单的提示框
在网页开发中,为了提高用户体验,经常会用到一些提示框来引导用户,这里分享下一些简单的提示框的制作 1.首先类似一个长方形右上角一个关闭按钮 这里用到的主要是一些定位的知识,运用relative和abs ...
- [Android] Android 类似今日头条顶部的TabLayout 滑动标签栏 效果
APP市场中大多数新闻App都有导航菜单,导航菜单是一组标签的集合,在新闻客户端中,每个标签标示一个新闻类别,对应下面ViewPager控件的一个分页面,今日头条, 网易新闻等. 本文主要讲的是用:T ...
- 利用Adorner制作用于图像裁切的选择框
原文:利用Adorner制作用于图像裁切的选择框 前天,我写了一篇"使用Adorner显示WPF控件的边界点"的文章.这次,使用从Adorner继承来写一个用于图像裁切的选择框. ...
- 利用CSS制作背景变色的横向导航栏
1.表单 页面如下: <html> <head> <title>注册表单页面</title> </head> <body> &l ...
- 数据可视化之powerBI技巧(三)这个Power BI技巧很可爱:利用DAX制作时钟
周末放松一下,给大家分享一个小技巧,仅利用DAX制作一个简易的时钟. 时钟效果如下: 这个时钟的制作只需一个度量值,你信吗? 事实上确实如此,制作步骤介绍如下: 1,新建参数,生成一个数字序列作为小时 ...
随机推荐
- Spring JDBCTemplate使用JNDI数据源
xml配置: <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverMana ...
- React入门 (1)—使用指南(包括ES5和ES6对比)
前言 本篇会简明扼要的介绍一下React的使用方法.代码会用JSX+ES5和JSX+ES6两种方式实现. React简介 React来自Facebook,于2013年开源.至今不断修改完善,现在已经到 ...
- Android -- View移动的六种方法
layout() 如果你将滑动后的目标位置的坐标传递给layout(),这样子就会把view的位置给重新布置了一下,在视觉上就是view的一个滑动的效果. public class DragView ...
- .net 估计要死在你手里了
最近不太爽,想换工作,上这些知名的招聘网站,一搜 .net 心凉了一截,很少有大公司用.net,工资也不是很高. 不用我多说什么,想必很多人应该有类似经历,只是打了牙往肚子里咽. 来两副图: 最近用滴 ...
- C#迭代器
迭代器概述 迭代器是可以返回相同类型的值的有序序列的一段代码. 迭代器可用作方法.运算符或 get 访问器的代码体. 迭代器代码使用 yield return 语句依次返回每个元素.yield bre ...
- KM模板
var n,m,i,j:longint; ans:int64; sel,lx,ly,slack:..] of int64; a:..,..] of int64; visx,visy:..] of bo ...
- 东大OJ-1544: GG的战争法则
题目描述 你在桥上看风景 看风景的人在楼上看你 明月装饰了你的窗子 你装饰了我的梦 这是GG在长坂坡发出的感叹. 三年前GG莫名的穿越到了三国时期,在这三年里他看尽了各种杀戮,心里早已麻木.GG他渴望 ...
- vijos P1009清帝之惑之康熙
</pre>背景康熙是中国历史乃至世界历史中最伟大的帝王之一,清除螯拜,撤除三藩,统一台湾,平定准葛尔叛乱:与此同时,出众的他也被世界各国遣清使臣所折服.康熙是历史上少有的全人,不仅文武兼 ...
- Android下的数据储存方式
安卓系统默认提供了一下几种数据储存的方式: Shared Preferences 内部储存 外部储存 SQLite数据库 保存到网络服务器 使用Shared Preferences ...
- 聚类算法kmeans
1. 聚类问题 所谓聚类问题,就是给定一个元素集合D,其中每个元素具有n个可观察属性,使用某种算法将D划分成k个子集,要求每个子集内部的元素之间相异度尽可能低,而不同子集的元素相异度尽可能高. 2. ...