Dubbo快速入门教程

article/2025/9/9 15:04:54

Dubbo入门教程

  • 1 、Dubbo概述
    • DUbbo架构
  • 2、Dubbo快速入门
    • Zookeeper 安装
    • 传统的模块化开发
    • Duboo入门小案例
      • 修改Service模块代码
      • 修改WEB模块代码
      • 增加公共的接口模块
  • 3、Dubbo高级特性
    • dubbo-admin管理平台
      • dubbo-adminm安装
        • 一、dubbo-admin安装
        • 二、dubbo-admin简单使用
    • 序列化
    • 地址缓存
    • 超时和重试
    • 多版本
    • 负载均衡(4种)
        • Random
        • RoundRobin
        • LeastActive
        • ConsistentHash:一致Hash,相同次数的请求总是发到同一提供者。
    • 集群容错
    • 服务降级

本笔记参考https://www.bilibili.com/video/BV1VE411q7dXp=7 视频整理获得

1 、Dubbo概述

  • Dubbo是阿里巴巴公司开源的一个高性能、轻量级的java RPC框架
  • 致力于提供高性能和透明化的RPC远程调用方案,以及SOA服务治理方案

官网地址:Apache Dubbo

DUbbo架构

节点角色说明:

  • Provider:暴露服务的服务提供方
  • Container:服务运行容器
  • Consumer:调用远程服务的服务消费方
  • Registry:服务注册与发现的注册中心
  • Monitor:统计服务的调用次数和调用时间的监控中心

//imgs/architecture.png

2、Dubbo快速入门

Zookeeper 安装

Zookeeper依赖java环境请确保您的机器安装过jdk
官网下载https://zookeeper.apache.org/releases.html
在这里插入图片描述
下载后解压
在这里插入图片描述
复制一份zoo_sample.cfg 文件 修改为zoo.cfg默认启动配置文件
在这里插入图片描述
配置端口和日志数据保存路径
在这里插入图片描述
zkServer.sh start 启动命令
zkServer.sh status查看状态
zkServer.sh stop 停止命令

其他系统安装可参考菜鸟教程

传统的模块化开发

1、创建Provider模块和Consumer模块
在这里插入图片描述
2、web模块引入service模块

 <!--依赖service模块--><dependency><groupId>cn.qileyun</groupId><artifactId>dubbo-service</artifactId><version>1.0-SNAPSHOT</version></dependency>

3、编写service

@Service
public class UserServiceImpl implements UserService {public String sayHello() {return "hello dubbo!";}
}

4、编写web

   //注入一下service@AutowiredUserService userService;@RequestMapping("/sayHello")public String sayHello(){return userService.sayHello();}

在这里插入图片描述

Duboo入门小案例

  1. 创建服务提供者Provider模块

  2. 创建服务消费者Consumer模块

  3. 在服务提供者模块编写UserServiceImpl提供服务

  4. 在服务消费者中UserController远程调用UserServiceImpl提供的服务

  5. 分别启动两个服务,测试
    导入Dubbo包

    <dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo</artifactId><version>${dubbo.version}</version>
    </dependency>
    <!--ZooKeeper客户端实现 -->
    <dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>${zookeeper.version}</version>
    </dependency>
    <!--ZooKeeper客户端实现 -->
    <dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>${zookeeper.version}</version>
    </dependency>
    

修改Service模块代码

1、修改service和web的启动端口
web

<build><plugins><!--tomcat插件--><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.1</version><configuration><port>8000</port><path>/</path></configuration></plugin></plugins>
</build>

service

 <port>9000</port>

spring提供的@Service是注册到spring容器中,而Dubbo提供的是注册到注册中心去
在这里插入图片描述
在这里插入图片描述
在applicationContext.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><!--我们不在需要通过spring帮我们扫描包了--><!--	<context:component-scan base-package="cn.qileyun.service"/>--><!--dubbo的配置--><!--1.配置项目的名称,唯一--><dubbo:application name="dubbo-service"/><!--2.配置一下注册中心的地址:当前使用的是zookeeper--><dubbo:registry address="zookeeper://127.0.0.1:2181"/><!--3.配置dubbo包扫描--><dubbo:annotation package="cn.qileyun.service.impl"/>
</beans>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!-- 加载spring容器 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring/applicationContext*.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>
</web-app>

修改WEB模块代码

1、web模块无需导入service模块了,以后都是通过Dubbo通过RPC进行调用
在这里插入图片描述
2、springmvc.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><mvc:annotation-driven/><context:component-scan base-package="cn.qileyun.controller"/><!--1.配置项目的名称,唯一--><dubbo:application name="dubbo-web"><!--防止和service端口冲突--><dubbo:parameter key="qos.prot" value="33333"/></dubbo:application><!--2.配置一下注册中心的地址:当前使用的是zookeeper--><dubbo:registry address="zookeeper://127.0.0.1:2181"/><!--3.配置dubbo包扫描--><dubbo:annotation package="cn.qileyun.controller"/>
</beans>

3、修改controller注入方式

//@Autowired//本地注入
/*** 1. 从zookeeper注册中心获取userService的访问url* 2. 进行远程雕调用RPC* 3. 将结果封装为一个代理对象。给变量赋值*///注入一下service
@Reference//远程注入
UserService userService;@RequestMapping("/sayHello")
public String sayHello() {return userService.sayHello();
}

增加公共的接口模块

在这里插入图片描述

web模块和service模块分别导入这个模块

 <!-- 公共接口模块--><dependency><groupId>cn.qileyun</groupId><artifactId>dubbo-interface</artifactId><version>1.0-SNAPSHOT</version></dependency>

运行看看
在这里插入图片描述
gitee项目地址:https://gitee.com/qlyml/dubbo-learning/tree/introduction/

3、Dubbo高级特性

dubbo-admin管理平台

  1. dubbo-admin管理平台,是图形化的服务管理界面
  2. 从注册中心中获取到所有的提供者/消费者进行配置管理
  3. 路由配置、动态配置、服务降级、访问控制、权重调整、负载均衡等管理功能
  4. dubbo-admin是一个前后端分离的项目。前端使用的是vue,后端使用springboot

dubbo-adminm安装

一、dubbo-admin安装

1、环境准备

dubbo-admin 是一个前后端分离的项目。前端使用vue,后端使用springboot,安装 dubbo-admin 其实就是部署该项目。我们将dubbo-admin安装到开发环境上。要保证开发环境有jdk,maven,nodejs
安装node(如果当前机器已经安装请忽略)****

2、下载 Dubbo-Admin

下载地址:https://github.com/apache/dubbo-admin

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-64aEdsKQ-1643270371702)(imageso8297063167.png)]

3、把下载的zip包解压到指定文件夹(解压到那个文件夹随意)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iZvCGw3g-1643270371703)(imageso8297477356.png)]

4、修改配置文件

解压后我们进入…dubbo-admin-developdubbo-admin-serversrcmain esources目录,找到 application.properties 配置文件 进行配置修改

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1sVcw2ir-1643270371704)(imageso8297603008.png)]

修改zookeeper地址

在这里插入图片描述

# centers in dubbo2.7 zookeeperip地址
admin.registry.address=zookeeper://ip:2181
admin.config-center=zookeeper://ip:2181
admin.metadata-report.address=://ip:2181

admin.registry.address注册中心
admin.config-center 配置中心
admin.metadata-report.address元数据中心

5、打包项目

在 dubbo-admin-develop 目录执行打包命令

mvn  clean package

在这里插入图片描述

6、启动后端

切换到目录

dubbo-Admin-developdubbo-admin-distributiontarget>

执行下面的命令启动 dubbo-admin,dubbo-admin后台由SpringBoot构建。
最好用jdk8进行运行不让登录报错

Caused by: java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter

java -jar .dubbo-admin-0.1.jar

在这里插入图片描述
发现启动失败了,原因是和zookeeper端口冲突
解决:
第一种方式:修改zookeeper的配置文件zoo.cfg
比如修改成8888
admin.serverPort=8888

第二种方式:修改dubbo-admin-server的端口
比如在dubbo-admin-server项目的application.properties文件中添加server.port=2399

7、前台后端

dubbo-admin-ui 目录下执行命令

npm run dev

由于我选择了第二种还需要修改前端访问后端地址
在这里插入图片描述
在这里插入图片描述

8、访问

浏览器输入。用户名密码都是root
http://localhost:8082/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uDDH9n5P-1643270371707)(imageso8300774258.png)]

二、dubbo-admin简单使用

在这里插入图片描述

注意:Dubbo Admin【服务Mock】【服务统计】将在后续版本发布…

在上面的步骤中,我们已经进入了Dubbo-Admin的主界面,在【快速入门】章节中,我们定义了服务生产者、和服务消费者,下面我们从Dubbo-Admin管理界面找到这个两个服务

1、点击服务查询
在这里插入图片描述

2、查询结果

在这里插入图片描述

A:输入的查询条件cn.qileyun

B:搜索类型,主要分为【按服务名】【按IP地址】【按应用】三种类型查询

C:搜索结果

3.1.4 dubo-admin查看详情

我们查看cn.qileyun.service.UserService (服务提供者)的具体详细信息,包含【元数据信息】

1)点击详情
在这里插入图片描述

从【详情】界面查看,主要分为3个区域

A区域:主要包含服务端 基础信息比如服务名称、应用名称等

B区域:主要包含了生产者、消费者一些基本信息

C区域:是元数据信息,注意看上面的图,元数据信息是空的

我们需要打开我们的生产者配置文件加入下面配置

<!-- 元数据配置 -->
<dubbo:metadata-report address="zookeeper://127.0.0.1:2181" />

在这里插入图片描述

重新启动生产者,再次打开Dubbo-Admin

这样我们的元数据信息就出来了
在这里插入图片描述

序列化

  • dubbo内部已经将序列化和反序列化的过程内部封装了

  • 我们只需要在定义pojo类时实现Serializable接口即可

  • 一般会定义一个公共的pojo模块,让生产者和消费者都依赖该模块。
    在这里插入图片描述
    1、创建一个公共的pojo模块
    在这里插入图片描述
    2、同样需要引入这个pojo对象的模块都导入到pom中
    3、编写pojo对象

    package cn.qileyun.pojo;
    //一定要序列化哦
    import java.io.Serializable;

    public class User implements Serializable {
    private int id;
    private String username;
    private String password;

    public User() {
    }
    

    。。。
    }

4、编写service

public User findUserByid(int id) {//查询User对象User user = new User(1,"zhangsan","123");return user;
}

5、编写web

 /*** 根据id查询用户信息* @param id* @return*/@RequestMapping("/find")@ResponseBodypublic User find(int id) {return userService.findUserByid(id);}

测试看看
在这里插入图片描述

地址缓存

思考一个问题:如果注册中心挂啦,服务示范可以正常访问?

  • 可以英文dubbo服务消费者在地由此调用时会缓存到本地,以后在调用则不会访问注册中心。
  • 当服务提供者地址发生变化时,注册中心会通知服务消费者。
    在这里插入图片描述
    停止zookeeper依然可以访问
    在这里插入图片描述

超时和重试

超时

  • 服务消费者在调用服务提供者的时候发生赌赛、等待的情形,这个时候,服务消费者会一直等待下去。
  • 在某个峰值时刻,大量的请求都在同时请求服务消费者,会造成线程的大量堆积,势必会造成雪崩。
  • dubbo利用 超时机制来解决这个问题,设置一个超时时间,在这个时间段内,无法完成服务访问,则自动断开连接。
  • 使用timeout属性配置超时时间,默认值1000,单位毫秒。

service模块中设置超时时间
在这里插入图片描述
web模块中设置超时时间
在这里插入图片描述
建议在Service模块中设置超时时间,调用方设置可以覆盖服务端端配置
在这里插入图片描述
重试

  • 设置来超时时间,在这个时间段内,无法完成服务访问,则自动断开连接。

  • 如果出现网络抖动,则这一次请求就会失败。

    @Service(timeout = 3000,retries = 2) //当前服务3秒超时.重式2次,一共三次

在这里插入图片描述

多版本

  • 灰度发布:当出现新功能时,会让一部分用户先使用新功能,用户反馈没问题时,再将所有用户迁移到新功能。

  • dubbo中使用version属性来设置和调用同一个借口的不同版本。

  • 在这里插入图片描述
    通过version声明版本

    @Service(version = “v1.0”) //当前服务3秒超时.重式2次,一共三次
    public class UserServiceImpl implements UserService {

    public String sayHello() {return "hello dubbo!";
    }public User findUserByid(int id) {System.out.println("old....");//查询User对象User user = new User(1, "zhangsan", "123");return user;
    }
    

    }

    @Service(version = “v2.0”) //当前服务3秒超时.重式2次,一共三次
    public class UserServiceImpl2 implements UserService {

    public String sayHello() {return "hello dubbo!";
    }public User findUserByid(int id) {System.out.println("new....");//查询User对象User user = new User(2, "zhangsan2", "123");return user;
    }
    

    }

调用方声明调用那个版本

@Reference(version = "v2.0")//远程注入UserService userService;@RequestMapping("/find")
@ResponseBody
public User find(int id) {return userService.findUserByid(id);
}

在这里插入图片描述

负载均衡(4种)

Random

  • 随机,按权重设置随机概率。
  • 在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。

1、多个服务声明权重

@Service(weight = 100)//声明权重

2、调用服务

@Reference(loadbalance = "random")//远程注入
UserService userService;

RoundRobin

  • 轮循,按公约后的权重设置轮循比率。
  • 存在慢的提供者累积请求问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。(针对此种情况,需要降低该服务的权值,以减少对其调用)

LeastActive

  • 最少活跃调用数,相同活跃数的随机。
  • 最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。
    使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。

ConsistentHash:一致Hash,相同次数的请求总是发到同一提供者。

  • 一致性Hash,相同参数的请求总是发到同一提供者。
  • 当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。

集群容错

  1. Failover Cluster
  • 失败自动切换,当出现失败,重试其它服务器。(缺省)
  • 通常用于读操作,但重试会带来更长延迟。
  • 可通过retries="2"来设置重试次数(不含第一次)。
  1. Failfast Cluster
  • 快速失败,只发起一次调用,失败立即报错。
  • 通常用于非幂等性的写操作,比如新增记录。
  1. Failsafe Cluster
  • 失败安全,出现异常时,直接忽略。
  • 通常用于写入审计日志等操作。
  1. Failback Cluster
  • 失败自动恢复,后台记录失败请求,定时重发。
  • 通常用于消息通知操作。
  1. Forking Cluster
  • 并行调用多个服务器,只要一个成功即返回。
  • 通常用于实时性要求较高的读操作,但需要浪费更多服务资源。
    可通过forks="2"来设置最大并行数。
  1. Broadcast Cluster
  • 广播调用所有提供者,逐个调用,任意一台报错则报错。(2.1.0开始支持)
  • 通常用于通知所有提供者更新缓存或日志等本地资源信息。

你可以在消费者设置

@Reference(cluster = "failsafe")//设置容错模式
UserService userService;

也可以在服务端设置

//将这个类提供方法(服务)对外发布,将访问地址ip、端口、路径注册中心去
@Service(cluster = "failsafe" ) //当前服务3秒超时.重式2次,一共三次
public class UserServiceImpl implements UserService {}

服务降级

屏蔽:force.mock (即:屏蔽请求,直接返回某个值,如上面的字符串,mock=“return 123456…”);

容错:fail.mock (即:允许请求,在请求失败的时候,再返回某个值,如:mock=“fail:return 123456…”);
如一下操作:

@Reference(mock = "force:return null")//不在去调用userService 并且啥都不返回
UserService userService;

在这里插入图片描述
以上很多配置都可以在服务者和消费者都可以去定义,并且可以在xml中定义
在这里插入图片描述


http://chatgpt.dhexx.cn/article/5rwgoye7.shtml

相关文章

dubbo教程总结(springboot+dubbo)

概述 Apache Dubbo 是一款微服务开发框架&#xff0c;它提供了 RPC通信 与 微服务治理 两大关键能力。这意味着&#xff0c;使用 Dubbo 开发的微服务&#xff0c;将具备相互之间的远程发现与通信能力&#xff0c; 同时利用 Dubbo 提供的丰富服务治理能力&#xff0c;可以实现诸…

Dubbo入门详细教程

什么是Dubbo&#xff1f; Dubbo 是阿里开源的远程服务调用(RPC)的分布式框架&#xff0c;提供了 SOA 服务治理方案;它的架构主要有五个角色/核心组件&#xff0c;分为是 Container(容器)、Provider(服务的提供方)、Registry(注册中心)、Consumer(服务的消费方)、Monitor(监控中…

dubbo 教程

&#xfeff;&#xfeff; 先给出阿里巴巴dubbo的主页&#xff1a;http://code.alibabatech.com/wiki/display/dubbo/Home-zh 自己的demo下载地址&#xff1a;http://download.csdn.net/detail/u012049463/6763315 1. Dubbo是什么&#xff1f; Dubbo是一个分布式服务框架&…

dubbo使用教程(可直接应用于企业开发)

本dubbo使用教程基于zookeeper-3.4.9搭建&#xff0c;包含服务提供者DubboProvider、和消费者DubboConsumer&#xff0c;可直接在Tomcat上运行。DubboProvider对外开放2个接口&#xff0c;DubboConsumer调用DubboProvider&#xff0c;并对外暴露HTTP服务。DubboProvider还提供了…

Dubbo快速入门

前言&#xff1a;本文需要建立在博主的环境之上来进行&#xff0c;大家也可以用自己的环境测试一下看能不能行得通&#xff0c;如果可以的话请在下方评论&#xff0c;让更多的人知道 Jdk&#xff1a;11 Springboot版本&#xff1a;2.6.6 Dubbo版本&#xff1a;0.2.0&#xf…

dubbo最全的使用教程

dubbo是阿里一款高性能&#xff0c;轻量级的rpc框架&#xff0c;有两大核心功能&#xff1a;远程服务调用和服务治理。本文主要介绍dubbo的运用。 一&#xff0c;安装注册中心zookeeper 1&#xff0c;为什么需要注册中心&#xff0c;不要能不能远程服务调用 答&#xff1a;可以…

VS2017安装教程(详细版)

1.首先下载好安装包 百度网盘下载链接 链接&#xff1a;https://pan.baidu.com/s/1HW8hrLMazRsBkPvkDHkD1Q?pwdz4jg 提取码&#xff1a;z4jg 2.下载到桌面以管理员身份运行 点击继续 3.进入后更改安装位置&#xff0c;选择安装路径&#xff0c;千万不要安装到C盘 4.改完后…

vs2017秘钥

vs2017 企业版秘钥&#xff1a;NJVYC-BMHX2-G77MM-4XJMR-6Q8QF 专业版秘钥&#xff1a;KBJFW-NXHK6-W4WJM-CRMQB-G3CDH 欢迎使用Markdown编辑器 你好&#xff01; 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章…

自定义 Tabhost 样式

经过了一天的折腾, 在网上也找了不少源码&#xff0c; 但是效果都不是很好&#xff0c;非常长&#xff0c; 最后自己终于写出了一个代码不是很多的Tabhost。 先上图(背景是随便弄的, 所以不怎么样) 首先&#xff0c; 我们要先写一个主xml main.xml 每一个LinearLayout代表…

tabHost 使用方法

近日 学习TabHost的使用 再网上搜不少文章 觉得这篇写的挺好 &#xff01; 出处 &#xff1a;http://www.blogjava.net/freeman1984/archive/2010/10/29/302803.html 查看tabhost的源代码&#xff0c;主要实例变量有&#xff1a; private TabWidget mTabWidget; priv…

android Tabhost控件的使用

Tabhost用来实现如图的效果&#xff1a; 上图的首页、自选、警报是由Tabhost控件来实现的&#xff0c;Tabhost控件中的每个tab其实都是一个Activity&#xff0c;也就是说我创建一个Tabhost&#xff0c;在tabhost中添加tab页就可以实现。 实现方式&#xff1a;1、创建布局文件 …

TabHost详解0

一、TabHost是一个选项卡容器&#xff0c;通过标签页将多个Activity整合到一起。 TabHost的三要素为&#xff1a;TabWidget、FrameLayout、List<TabSpec>。 其主要的使用方式有两种&#xff1a; 1.继承TabActivity&#xff0c;结合对应的xml配置文件导入tab选项内容体 …

TabHost

TabHost的实现有两种方式&#xff0c;第一种继承TabActivity&#xff0c;从TabActivity中用getTabHost()方法获取TabHost。各个Tab中的内容在布局文件中定义就行了。 mainActivity.xml private TabHost myTabHost;Overridepublic void onCreate(Bundle savedInstanceState) {su…

Android初级控件TabHost

TabHost我们都知道是用来实现导航栏布局来切换页面的&#xff0c;这个也是元老级的控件了&#xff0c;现在逐渐被TabLayout,BottomNavigationBar,使用RadioButton自定义。。。等等给取代了。TabHost有个好处就是它添加的是Activity而不像上面那些全部使用Fragment来显示内容。 …

Android中TabHost嵌套TabHost

在嵌套TabHost时&#xff0c;先后遇到了以下情况&#xff1a; 问题1&#xff1a;内部TabHos无显示&#xff0c;只显示了其中的一个Activity&#xff1b; 解决&#xff1a;按下文比对主子TabHos的布局文件和java文件并修改&#xff1b; 问题2&#xff1a;如上所做后&#xff…

Android的Tab与TabHost讲解

在Android应用中&#xff0c;经常会用到TabHost选项卡,可以方便地在不同页面间切换。之前看过网上的一些教程&#xff0c;但大多都是一个形式&#xff0c;看得迷迷糊糊&#xff0c;不能让人很好的理解和学习。所以&#xff0c;在此详细地列出了Tab与TabHost的使用方法&#xff…

Android - TabHost 选项卡功能用法详解

一、实例 二.、TabHost介绍 TabHost组件可以在界面中存放多个选项卡, 很多软件都使用了改组件进行设计; 1. TabHost常用组件 TabWidget : 该组件就是TabHost标签页中上部 或者 下部的按钮, 可以点击按钮切换选项卡; TabSpec : 代表了选项卡界面, 添加一个TabSpec即可添加到TabH…

【转】TabHost详解

请大家尊重作者版权&#xff0c;转载请标明出处&#xff1a;http://blog.csdn.net/harvic880925/article/details/17120325 前言&#xff1a;今天仔细研究了下TabHost&#xff0c;主要是为了实现微信底部导航栏的功能&#xff0c;最后也给出一个链接&#xff0c;这位老兄用TabH…

Android入门第十一篇之TabHost,TabWidget

本文来自http://blog.csdn.net/hellogv/ &#xff0c;引用必须注明出处&#xff01; 这回要介绍的是Android的Tab控件&#xff0c;Tab控件可以达到分页的效果&#xff0c;让一个屏幕的内容尽量丰富&#xff0c;当然也会增加开发的复杂程度&#xff0c;在有必要的时候再使用。An…

android Tabhost部件

本文结合源代码和实例来说明TabHost的用法。 使用TabHost 可以在一个屏幕间进行不同版面的切换&#xff0c;例如android自带的拨号应用&#xff0c;截图&#xff1a; 查看tabhost的源代码&#xff0c;主要实例变量有&#xff1a; private TabWidget mTabWidget; …