官方社群在线客服官方频道防骗查询货币工具

基于 Go 语言开发在线论坛(三):访问论坛首页

2025-01-14 02:16:51
news.like.tgnews.like.tgnews.like.tgnews.like.tg

LIKE.TG 成立于2020年,总部位于马来西亚,是首家汇集全球互联网产品,提供一站式软件产品解决方案的综合性品牌。唯一官方网站:www.like.tg

1、整体流程

前面两篇教程学院君分别给大家介绍了基于 Go 语言构建在线论坛的整体设计以及数据表的创建、模型类的编写,今天我们来看看如何在服务端处理用户请求。

用户请求的处理流程如下:

  1. 客户端发送请求;
  2. 服务端路由器(multiplexer)将请求分发给指定处理器(handler);
  3. 处理器处理请求,完成对应的业务逻辑;
  4. 处理器调用模板引擎生成 HTML 并将响应返回给客户端。

接下来我们按照这个流程来编写服务端代码。

2、定义路由器

这里我们基于 gorilla/mux 来实现路由器,所以需要安装对应依赖:

代码语言:javascript
复制
go get github.com/gorilla/mux

然后我们遵循仿照 Laravel 框架对 Go 路由处理器代码进行拆分这篇教程介绍的组织架构将路由器定义在 routes 目录下的 router.go 中:

代码语言:javascript
复制
package routes

import "github.com/gorilla/mux"

// 返回一个 mux.Router 类型指针,从而可以当作处理器使用
func NewRouter() *mux.Router {

    // 创建 mux.Router 路由器示例
    router := mux.NewRouter().StrictSlash(true)

    // 遍历 web.go 中定义的所有 webRoutes
    for _, route := range webRoutes {
        // 将每个 web 路由应用到路由器
        router.Methods(route.Method).
            Path(route.Pattern).
            Name(route.Name).
            Handler(route.HandlerFunc)
    }

    return route
}

将所有路由定义在同一目录的 routes.go 中:

代码语言:javascript
复制
package routes

import "net/http"

// 定义一个 WebRoute 结构体用于存放单个路由
type WebRoute struct {
    Name        string
    Method      string
    Pattern     string
    HandlerFunc http.HandlerFunc
}

// 声明 WebRoutes 切片存放所有 Web 路由
type WebRoutes []WebRoute

// 定义所有 Web 路由
var webRoutes = WebRoutes{

}

3、启动 HTTP 服务器

最后在项目根目录下的 main.go 中引入上述路由器来启动 HTTP 服务器:

代码语言:javascript
复制
package main

import (
    . "github.com/xueyuanjun/chitchat/routes"
    "log"
    "net/http"
)

func main()  {
    startWebServer("8080")
}

// 通过指定端口启动 Web 服务器
func startWebServer(port string)  {
    r := NewRouter()
    http.Handle("/", r)  // 通过 router.go 中定义的路由器来分发请求

    log.Println("Starting HTTP service at " + port)
    err := http.ListenAndServe(":" + port, nil) // 启动协程监听请求

    if err != nil {
        log.Println("An error occured starting HTTP listener at port " + port)
        log.Println("Error: " + err.Error())
    }
}

具体代码含义已经在注释中介绍清楚了,这里我们指定 HTTP 服务器监听 8080 端口,使用的路由器正是上述 router.goNewRouter 方法返回的 mux.Router 指针类型实例,这里可以看到引用的时候并没有带上包名前缀,之所以可以这么做是因为通过如下这种方式引入的 routes 包:

代码语言:javascript
复制
. "github.com/xueyuanjun/chitchat/routes"

注意到前面的 . 别名,通过这种方式引入的包可以直接调用包中对外可见的变量、方法和结构体,而不需要加上包名前缀。

还有一种方式是通过 _ 别名引入,这样一来只会调用该包里定义的 init 方法,我们在上篇教程引入 go-sql-driver/mysql 包时就是这么做的:

代码语言:javascript
复制
_ "github.com/go-sql-driver/mysql"

4、处理静态资源

在线论坛涉及到前端静态资源文件的处理,我们可以在 startWebServer 方法中新增如下这两行代码:

代码语言:javascript
复制
r := NewRouter() // 通过 router.go 中定义的路由器来分发请求

// 处理静态资源文件
assets := http.FileServer(http.Dir("public"))
r.PathPrefix("/static/").Handler(http.StripPrefix("/static/", assets))

http.Handle("/", r) // 应用路由器到 HTTP 服务器

...

其中 http.FileServer 用于初始化文件服务器和目录为当前目录下的 public 目录。

然后在第二段代码中指定静态资源路由及处理逻辑:将 /static/ 前缀的 URL 请求去除 static 前缀,然后在文件服务器查找指定文件路径是否存在(public 目录下的相对地址)。

比如 URL 请求路径为 http://localhost:8080/static/css/bootstrap.min.css,对应的查找路径是:

代码语言:javascript
复制
<application root>/public/css/bootstrap.min.css

对于静态资源文件直接返回文件内容,不会进行额外处理。

5、编写处理器实现

1)首页处理器方法

做好上述准备工作后,接下来,我们来创建论坛首页的路由处理器,在 handlers 目录下新增一个 index.go 来定义首页的处理器方法:

代码语言:javascript
复制
package handlers

import (
    "github.com/xueyuanjun/chitchat/models"
    "html/template"
    "net/http"
)

// 论坛首页路由处理器方法
func Index(w http.ResponseWriter, r *http.Request) {
    files := []string{"views/layout.html", "views/navbar.html", "views/index.html",}
    templates := template.Must(template.ParseFiles(files...))
    threads, err := models.Threads();
    if err == nil {
        templates.ExecuteTemplate(w, "layout", threads)
    }
}

2)创建视图模板

这里我们使用 Go 自带的 html/template 作为模板引擎,需要传入位于 views 目录下的视图模板文件,这里传入了多个模板文件,包括主布局文件 layout.html

代码语言:javascript
复制
{{ define "layout" }}

  <!DOCTYPE html>
  <html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=9">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>ChitChat</title>
    <link href="/static/css/bootstrap.min.css" rel="stylesheet">
    <link href="/static/css/font-awesome.min.css" rel="stylesheet">
  </head>
  <body>
    {{ template "navbar" . }}

  <div class="container">

        {{ template "content" . }}

  </div> <!-- /container -->

  <script src="/static/js/jquery-2.1.1.min.js"></script>
  <script src="/static/js/bootstrap.min.js"></script>
  </body>
  </html>

{{ end }}

顶部导航模板 navbar.html

代码语言:javascript
复制
{{ define "navbar" }}
  <div class="navbar navbar-default navbar-static-top" role="navigation">
    <div class="container">
      <div class="navbar-header">
        <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse">
          <span class="sr-only">Toggle navigation</span>
          <span class="icon-bar"></span>
          <span class="icon-bar"></span>
          <span class="icon-bar"></span>
        </button>
        <a class="navbar-brand" href="/">
          <i class="fa fa-comments-o"></i>
          ChitChat
        </a>
      </div>
      <div class="navbar-collapse collapse">
        <ul class="nav navbar-nav">
          <li><a href="/">Home</a></li>
        </ul>
        <ul class="nav navbar-nav navbar-right">
          <li><a href="/login">Login</a></li>
        </ul>
      </div>
    </div>
  </div>
{{ end }}

以及首页视图模板 index.html

代码语言:javascript
复制
{{ define "content" }}
  <p class="lead">
    <a href="/thread/new">Start a thread</a> or join one below!
  </p>

    {{ range . }}
    <div class="panel panel-default">
      <div class="panel-heading">
        <span class="lead"> <i class="fa fa-comment-o"></i> {{ .Topic }}</span>
      </div>
      <div class="panel-body">
        Started by {{ .User.Name }} - {{ .CreatedAtDate }} - {{ .NumReplies }} posts.
        <div class="pull-right">
          <a href="/thread/read?id={{.Uuid }}">Read more</a>
        </div>
      </div>
    </div>
    {{ end }}

{{ end }}

引入多个视图模板是为了提高模板代码的复用性,因为对于同一个应用的不同页面来说,可能基本布局、页面顶部导航和页面底部组件都是一样的,关于视图模板的细节,我们在后面视图模板部分会详细介绍,这里简单了解下即可。

3)渲染视图模板

我们可以从数据库查询群组数据并将该数据传递到模板文件,最后将模板视图渲染出来,对应代码如下:

代码语言:javascript
复制
threads, err := models.Threads();
if err == nil {
    templates.ExecuteTemplate(w, "layout", threads)
}

编译多个视图模板时,默认以第一个模板名作为最终视图模板名,所以这里第二个参数传入的是 layout,第三个参数传入要渲染的数据 threads,对应的渲染逻辑位于 views/index.html 中:

代码语言:javascript
复制
{{ range . }}
  <div class="panel panel-default">
    <div class="panel-heading">
      <span class="lead"> <i class="fa fa-comment-o"></i> {{ .Topic }}</span>
    </div>
    <div class="panel-body">
      Started by {{ .User.Name }} - {{ .CreatedAtDate }} - {{ .NumReplies }} posts.
      <div class="pull-right">
        <a href="/thread/read?id={{.Uuid }}">Read more</a>
      </div>
    </div>
  </div>
{{ end }}

其中 {{ range . }} 表示将处理器方法传入的变量,这里是 threads 进行循环。

4)注册首页路由

最好,我们在 routes/routes.go 中注册首页路由及对应的处理器方法 Index

代码语言:javascript
复制
import "github.com/xueyuanjun/chitchat/handlers"

// 定义所有 Web 路由
var webRoutes = WebRoutes{
    {
        "home",
        "GET",
        "/",
        handlers.Index,
    },
}

6、访问论坛首页

访问论坛首页之前,我们将相应的前端资源文件拷贝到 public 目录下,此时项目整体目录结构如下:

注:对应的前端资源可以从项目的 Github 仓库获取:https://github.com/nonfu/chitchat.git。

然后我们在项目根目录下运行如下代码启动 HTTP 服务器:

代码语言:javascript
复制
go run main.go

然后我们在浏览器访问论坛首页 http://localhost:8080

一切与预期一致,下篇教程,我们将基于 Cookie + Session 实现用户认证并创建群组和主题。

现在关注【LIKE.TG出海指南频道】【LIKE.TG生态链-全球资源互联社区】,即可免费领取【WhatsApp、LINE、Telegram、Twitter、ZALO云控】等获客工具试用、【住宅IP、号段筛选】等免费资源,机会难得,快来解锁更多资源,助力您的业务飞速成长!点击【联系客服】

本文由LIKE.TG编辑部转载自互联网并编辑,如有侵权影响,请联系官方客服,将为您妥善处理。

This article is republished from public internet and edited by the LIKE.TG editorial department. If there is any infringement, please contact our official customer service for proper handling.


科技论坛互联网论坛虚拟币论坛技术论坛科技峰会互联网峰会虚拟币峰会技术峰会社交媒体论坛世界互联网Server deployment数据论坛数据峰会网络论坛网络峰会战略论坛开放论坛全球论坛全球峰会发展论坛人工智能论坛程序员论坛
加入like.tg生态圈,即可获利、结识全球供应商、拥抱全球软件生态圈加入like.tg生态圈,即可获利、结识全球供应商、拥抱全球软件生态圈加入like.tg生态圈,即可获利、结识全球供应商、拥抱全球软件生态圈
全球峰会
#自媒体#新媒体课堂——自媒体平台知多少?自媒体平台有哪些?
#自媒体#新媒体课堂——自媒体平台知多少?自媒体平台有哪些?
自媒体带起了一波创业者的高潮,做自媒体的主要就是两类人,要么是为了流量,获得用户关注;要么是为了阅读量,广告变现。说白了就是为了名利!有很多人都想做自媒体,但是该怎么做才好呢?做自媒体,写文章虽然重要,但是发文章比写重要10倍以上,只有让更多的人看到你的文章,你的文章才能给你带来更大的价值,一篇文章写出来,你发的平台不对,也不行。今天知道君整理了一些可以免费注册与发布的自媒体平台,如果你把文章发布到这些自媒体平台,你的每篇文章最少都有几万人看到,效果怎么样, 就不用多说了。现在直接分享给大家:微信公众平台微信公众平台,给个人、企业和组织提供业务服务与用户管理能力的全新服务平台。… 给企业和组织提供更强大的业务服务与用户管理能力,帮助企业快速实现全新的公众号服务平台是否免费:免费操作难度:简单应用类型:全部应用网址:http://mp.weixin.qq.com今日头条今日头条是一款基于数据挖掘的推荐引擎产品,它为用户推荐有价值的、个性化的信息,提供连接人与信息的新型服务,是国内移动互联网领域成长最快的产品服务之一是否免费:免费操作难度:简单应用类型:全部应用网址:http://www.toutiao.com/百度百家百家是百度新闻的原创内容类平台。每日发布的优质内容将会在百度新闻的网页版、移动端呈现,并被百度搜索和百度其他产品线收录。是否免费:免费操作难度:简单应用类型:全部应用网址:http://baijia.baidu.com/搜狐媒体平台搜狐媒体平台是在搜狐门户改革背景下全新打造的内容发布和分类分发全平台。各个行业的优质内容供给者(媒体、自媒体)均可免费申请入驻,为搜狐提供内容;利用搜狐强大的媒体影响力,入驻媒体和自媒体可获取自己的用户,提升个人的品牌影响力是否免费:免费操作难度:简单应用类型:全部应用网址:http://mp.sohu.com/一点资讯一点资讯是一款高度智能的新闻资讯应用,通过它你可以搜索并订阅任意关键词,它会自动帮你聚合整理并实时更新相关资讯,同时会智能分析你的兴趣爱好,为你推荐感兴趣的内容。看新闻资讯,一点就够了!是否免费:免费操作难度:简单应用类型:全部应用网址:http://www.yidianzixun.com/网易媒体平台网易订阅,聚合旅游、时尚、财经、科技资讯、时事新闻、RSS等众多内容,提供个性化的阅读服务是否免费:免费操作难度:简单应用类型:全部应用网址:http://dy.163.com/wemedia/login.html企鹅媒体平台企鹅媒体平台是2016年3月1日,企鹅媒体平台正式推出,腾讯将提供四个方面的能力。是否免费:免费操作难度:简单应用类型:全部应用网址:https://om.qq.com/userAuth/index北京时间号北京时间互联网门户全新领导者,依托强大的推荐引擎与专业的媒体人团队为用户实时呈现最具价值的新鲜资讯。是否免费:免费操作难度:简单应用类型:全部应用网址:http://www.btime.com/QQ公众号QQ公众平台聚合着无限可能。凭借16年来积累的8亿用户资源,依托强势平台技术、数据沉淀和社交关系,QQ公众平台将有效聚集品牌和消费者,以开放合作的姿态与你一起打造未来。是否免费:免费操作难度:简单应用类型:全部应用网址:http://mp.qq.com/凤凰自媒体“凤凰自媒体”正式更名为“凤凰号”。据了解,凤凰自媒体平台更名后,希望能加快品牌特色化进程,深耕高质量内容领域,由此形成行业差异化竞争格局,实现优质文章在凤凰新闻客户端、凤凰网、手机凤凰网、凤凰视频客户端等渠道的有效分发。是否免费:免费操作难度:简单应用类型:全部应用网址:http://fhh.ifeng.com/login大鱼号大鱼号是阿里文娱体系为内容创作者提供的统一账号。大鱼号实现了阿里文娱体系一点接入,多点分发。内容创作者一点接入大鱼号,上传图文/视频可被分发到UC、优酷、土豆、淘系客户端,未来还会扩展到豌豆荚、神马搜索、PP助手等。是否免费:免费操作难度:简单应用类型:全部应用网址:http://mp.uc.cn/index.html知乎一个真实的网络问答社区,帮助你寻找答案,分享知识。..是否免费:免费操作难度:简单应用类型:全部应用网址:https://www.zhihu.com/钛媒体【钛媒体官方网站】钛媒体是国内首家TMT公司人社群媒体,最有钛度的一人一媒体平台,集信息交流融合、IT技术信息、新媒体于一身的媒体平台。是否免费:免费操作难度:简单应用类型:全部应用网址:http://www.tmtpost.com/LIKE.TG+社区LIKE.TG最新又推出了一款扶持计划-『自媒体分享计划』满足条件的自媒体,入驻LIKE.TG+社区,可分享总价值百万资源包是否免费:免费操作难度:困难应用类型:全部应用网址:https://cloud.tencent.com/developer/support-plan?invite_code=oc38tj48tn8qhttp://www.tmtpost.com/虎嗅网聚合优质的创新信息与人群,捕获精选|深度|犀利的商业科技资讯。在虎嗅,不错过互联网的每个重要时刻。是否免费:免费操作难度:简单应用类型:全部应用网址:https://www.huxiu.com/砍柴网砍柴网创立于2013年,是一家拥有全球视野的前沿科技媒体,我们始终秉承观点独到、全面深入、有料有趣的宗旨,在科技与人文之间寻找商业新价值,坚持以人文的视角解读科技,用专业的精神剖析时代,孜孜不倦探索科技与商业的未来。是否免费:免费操作难度:简单应用类型:全部应用网址:http://www.ikanchai.com/i黑马i黑马是面向创业者的创新型综合服务平台,掌握创业创新领域强有力话语权的媒体矩阵,致力于帮助创业者获得投资、人才、宣传和经验。是否免费:免费操作难度:简单应用类型:全部应用网址:http://www.iheima.com/雷锋网雷锋网是国内最早关注人工智能和智能硬件领域的互联网科技媒体,内容涵盖人工智能、智能硬件、机器人、智能驾驶、ARVR、网络安全、物联网、未来医疗、金融科技等9大领域。雷锋网致力于连接和服务学术界、工业界与投资界,为用户提供更专业的互联网科技资讯和培训服务,让用户读懂智能与未来。是否免费:免费操作难度:简单应用类型:全部应用网址:http://www.leiphone.com/猎云网猎云网坚守用心服务创业者的理念,专注创业创新,互联网创业项目推荐,关注新产品、新公司、新模式,以原创独家报道、分析以及美国硅谷的一手报道闻名业界。为创业者、投资人及相关业内人士提供交流学习、资源对接的桥梁。是否免费:免费操作难度:简单应用类型:全部应用网址:http://www.lieyunwang.com/锌媒体锌媒体是一个关注前沿科技资讯、移动互联网,发现以及商业创新价值的泛科技自媒体平台。精选最新科技新闻,分享即时的移动互联网行业动态和以及提供最具商业价值的互联网创业案例,投资案例。提供绝对给力的干货、,在科技与人文之间挖掘商业新价值。是否免费:免费操作难度:简单应用类型:全部应用网址:http://www.xinmeti.com/派代网派代网定位为中国电子商务的入口,目前是中国最活跃、最具影响力的电子商务行业交流平台,聚集了大量的电子商务领军企业创始人群。提供电商学习、人才招聘、企业贷款等电子商务综合服务。是否免费:免费操作难度:简单应用类型:全部应用网址:http://www.paidai.com/简书致力于开发维护一套集合文字的书写、编集、发布功能于一体的在线写作编辑工具是否免费:免费操作难度:简单应用类型:全部应用网址:http://www.jianshu.com/亿欧网亿欧是一家专注于新科技、新理念与各产业结合,以助力产业创新升级为使命的服务平台。亿欧旗下有4款产品,分别是亿欧网、视也、天窗、企服盒子。自2014年2月9日开始运营后,迅速成为互联网创业者和产业创新者的首选学习平台,是上百家知名企业的首选商业合作伙伴;先后获得盈动资本、高榕资本、盛景网联领投的三轮融资是否免费:免费操作难度:简单应用类型:全部应用网址:http://www.iyiou.com/思达派思达派是专注创业服务市场的新媒体平台,定位“创业干货分享”,一站集成创业经验、教训等干货,帮助创业者少走弯路。同时还将举办各种线下创业分享和交流活动,分享创业心得,对接人脉、资本、以及公关推广等资源。是否免费:免费操作难度:简单应用类型:全部应用网址:http://www.startup-partner.com/界面界面是最受中国中产阶级欢迎的新闻及商业社交平台,旗下拥有精品新闻业务界面新闻、专业投资资讯平台摩尔金融及中国最大独立设计师电商网站尤物。是否免费:免费操作难度:简单应用类型:全部应用网址:http://www.jiemian.com/爱范儿聚焦新创和消费主题的科技媒体,成立于 2008 年 10 月,关注产品及体验,致力于“独立,前瞻,深入”的原创报道和分析评论,是国内唯一一家在产业和产品领域同时具有强势影响力的科技媒体。旗下现有 ifanr.com、SocialBase.cn、AppSolution、玩物志、创业及产品社区 MindStore 等多个细分领域的知名产品。是否免费:免费操作难度:简单应用类型:全部应用网址:http://www.ifanr.com/36氪36氪为您提供创业资讯、科技新闻、投融资对接、股权投资、极速融资等创业服务,致力成为创业者可以依赖的创业服务平台,为创业者提供最好的产品和服务。是否免费:免费操作难度:简单应用类型:全部应用网址:http://36kr.com如果一篇文章在一个平台一天有100个阅读量,在50个平台上就是5000阅读,那么10天呢,一年356天呢,可能前期会辛苦一点,但是你需要坚持,越到后面,你在互联网上发布的文章越多,加你的人也会越多,而且这些文章将会在多年以后都能够继续为你带来流量,有的人两年前写的文章,现在还有人看了还会加v信。外加两个,趣头条,惠头条。有的人可能会问,这么多平台,发文章比写文章还累!额。。。。。。你需要学会找工具,早就有人开发出来了一键发布功能,一篇文章可以同时发布到多个自媒体平台上!什么工具呢?百度一下,你就知道!以上,是今天给大家提供的一些思路,希望对大家有帮助!这些仅仅是各大门户网站的自媒体开放平台,没有精确到各种类型的全部平台,如小视频类app、综合视频类网站都没有开始说,由于篇幅的原因,留到以后再进行补充吧。
1-4月美国电商支出3316亿美元,消费者转向低价商品
1-4月美国电商支出3316亿美元,消费者转向低价商品
AMZ123 获悉,日前,据外媒报道,Adobe Analytics 的数据显示,2024 年前四个月美国电商增长强劲,同比增长 7%,达到 3316 亿美元。据了解,Adobe Analytics 对美国在线交易数据进行了分析,涵盖美国零售网站的一万亿次访问、1 亿个 SKU 和 18 个产品类别。2024 年 1 月 1 日至 4 月 30 日,美国在线支出达 3316 亿美元,同比增长 7%,得益于电子产品、服装等非必需品的稳定支出以及在线杂货购物的持续激增。Adobe 预计,2024 年上半年在线支出将超过 5000 亿美元,同比增长 6.8%。今年前四个月,美国消费者在线上消费电子产品 618 亿美元(同比增长 3.1%),服装 525 亿美元(同比增长 2.6%)。尽管增幅较小,但这两个类别占电商总支出的 34.5%,帮助保持了营收增长。同时,杂货进一步推动了增长,在线支出达 388 亿美元,同比增长 15.7%。Adobe 预计,未来三年内,该类别将成为电商市场的主导力量,其收入份额与电子产品和服装相当。另一个在线支出费增长较快的类别是化妆品,该类别在 2023 年带来了 350 亿美元的在线消费,同比增长 15.6%。而这一上升趋势仍在继续,截至 4 月 30 日,2024 年美国消费者在化妆品上的在线支出为 132 亿美元,同比增长 8%。此外,数月持续的通货膨胀导致消费者在多个主要类别中购买更便宜的商品。Adobe 发现,个人护理(增长 96%)、电子产品(增长 64%)、服装(增长 47%)、家居/花园(增长 42%)、家具/床上用品(增长 42%)和杂货(增长 33%)等类别的低价商品份额均大幅增加。具体而言,在食品杂货等类别中,低通胀商品的收入增长 13.4%,而高通胀商品的收入下降 15.6%。在化妆品等类别中,影响相对较弱,低通胀商品的收入增长 3.06%,高通胀商品的收入仅下降 0.34%,主要由于消费者对自己喜欢的品牌表现出了更强的忠诚度。而体育用品(增长 28%)、家电(增长 26%)、工具/家装(增长 26%)和玩具(增长 25%)等类别的低价商品份额增幅均较小,这些类别的增幅也主要受品牌忠诚度影响,同时消费者更倾向于购买最高品质的此类产品。此外,“先买后付”(BNPL)支付方式在此期间也出现了持续增长。2024 年 1 月至 4 月,BNPL 推动了 259 亿美元的电商支出,较去年同期大幅增长 11.8%。Adobe 预计,BNPL 将在 2024 年全年推动 810 亿至 848 亿美元的支出,同比增长 8% 至 13%。
12月波兰社媒平台流量盘点,TikTok追赶Instagram
12月波兰社媒平台流量盘点,TikTok追赶Instagram
AMZ123 获悉,近日,市场分析机构 Mediapanel 公布了 2023 年 12 月波兰主流社交平台的最新用户统计数据。受 TikTok 的打击,Pinterest、Facebook 和 Instagram 的用户数量出现下降。根据 Mediapanel 的数据,截至 2023 年 12 月,TikTok 是波兰第三大社交媒体平台,拥有超过 1378 万用户,相当于波兰 46.45% 的互联网用户。排在 TikTok 之前的是 Facebook 和 Instagram,其中 Facebook 拥有超过 2435 万用户,相当于波兰 82.06% 的互联网用户;Instagram 则拥有超过 1409 万用户,相当于波兰 47.47% 的互联网用户。在用户使用时长方面,TikTok 排名第一。2023 年 12 月,TikTok 用户的平均使用时长为 17 小时 18 分钟 42 秒。Facebook 用户的平均使用时长为 15 小时 36 分钟 38 秒,位居第二。其次是 Instagram,平均使用时长为 5 小时 2 分钟 39 秒。与 11 月相比,12 月 Facebook 减少了 58.84 万用户(下降 2.4%),但其用户平均使用时间增加了 32 分钟 50 秒(增长 3.6%)。Instagram 流失了 25.9 万用户(下降 1.8%),但其用户平均使用时间增加了 15 分钟(增长 5.2%)。虽然 TikTok 的用户数量略有增长(增长 8.85 万,即 0.6%),但其用户平均使用时间减少了 47 分钟(减少 4.3%)。12 月份,波兰其他主流社交媒体平台的用户数据(与 11 月相比):X 增加了 39.64 万用户(增长 4.8%),用户平均使用时间增加了 6 分钟 19 秒(增长 9.3%);Pinterest 增加了 23.02 万用户(增长 3.5%),用户平均使用时间增加了 7 分钟 9 秒(增长 16.1%);Snapchat 则增加了 9.04 万用户(增长 1.8%),用户平均使用时间增加了 23 秒(增长 0.2%);LinkedIn 流失了 27.69 万用户(下降 6.2%),用户平均使用时间减少了 1 分钟 36 秒(下降 11.7%);Reddit 流失了 18.6 万用户(下降 7.1%),用户平均使用时间减少了 1 分钟 27 秒(下降 11.6%)。
科技论坛
公司(视频 社交)项目分享
公司(视频 社交)项目分享
http://blog.csdn.net/u011733020/article/details/46786471 最近公司工作比较轻松,就把以前的项目 拿来整理下。以前公司做视频社交这一块,类似于YY直播。 展示 先来个动态图 再简单看一下主要界面 首页第一个界面,这里可以看美女,看直播 这是任务列界面,可以领取每日任务,任务分成长 和推荐 好友列表 用户的个人中心页 直播间 用户的个人中心页 充值方式页 银联支付页 项目组成 这个项目主要的重点就两个地方,看视频,和 与主播互动。 整个视频流是用RTMP协议的,文字聊天走的是openfire+asmack . PS:整个项目,我们产品设计的很不错的,只是我水平有限,有些功能 实现不了! 再介绍下,整个项目都用到了什么? 程序框架:SlidingMenu+Viewpager+fragment 请求服务器: asynchttpclient 解析数据:Gson 消息推送: Jpush 页面数据分析: Umeng 充值方式: alipay +银联+yeepay+短信充值 图片缓存: afinal 自定义view: Pulltoresfresh+拼音排序联系人+horizontallistview+verticalviewpager… 另,我把公司的项目写出来,是因为公司的服务器停掉了,所以,一些数据,是我自己抓出其他应用里面的(抓取数据的方法,在上面一篇文章里)…. 首先就是整个项目最下面是mainactivity,这个大家是都有共识的,在mainactivity 上面 我们就要 引入slidingmenu, 关于slidingmenu的下载,就不介绍了,这里直接拿来用 包结构比较清晰 , 整个项目首先,由splashactivity 欢迎界面 ,进行检查,然后跳转到mainactivity,mainactivity 中包含slidingmenu,slidingmenu的中间界面 添加了viewpager,viewpager 里面添加了四个fragment。 由于默认v4包里的viewpager 会默认混存数据,即使你设置了setOffscreenPageLimit(0),所以这里替换掉原生的v4包,并且通过fragment 的 setuservisibilityhint 方法来,控制 fragment 界面的动态刷新。 主界面的第一个fragment ,也就是约美女的界面,通过fragmenttabhost,来实现约美女,和看直播的切换。 在约美女中,就是一个简单地pulltorefreshlistview,适配了一个item.点击item 进入用户的个人中心, 个人中心 顶部 是个人的宣传适配,下面,是用户自己上传的 公开专辑,或者私密专辑。可以点赞,关注他。 做任务界面是有两种任务,一种是 每日任务,就是 登陆,签到,另一种是下载app 得积分任务。 下载app 可以控制 下载 暂停。 在我的关注界面。是你关注的好友,这个跟微信的联系人控件是一样的。首字母排序,用到了比较器。 首先 把汉字,对应首字母提取出来,然后与A-Z 排序。以及特殊字符~。 基本代码 整个项目 基本框架 简单描述下 在MainActiviy中初始化 slidingmenu。MainActivity 布局文件 &lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;com.os.slidingmenu.SlidingMenu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:sliding="http://schemas.android.com/apk/res-auto" android:id="@+id/slidingmenu" android:layout_width="fill_parent" android:layout_height="fill_parent" sliding:behindOffset="60dp" sliding:fadeEnabled="true" sliding:mode="left" sliding:secondaryShadowDrawable="@drawable/sliding_shadow_right" sliding:shadowDrawable="@drawable/sliding_shadow_left" sliding:shadowWidth="10dp" sliding:touchModeAbove="fullscreen" sliding:touchModeBehind="margin" /&gt; MainActivity这个类进行初始化。代码语言:javascript复制&lt;code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"&gt;&lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;package&lt;/span&gt; com.os.activity; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;import&lt;/span&gt; java.lang.ref.WeakReference; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;import&lt;/span&gt; com.os.activity.base.BaseFragmentActivity; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;import&lt;/span&gt; com.os.activity.base.BaseSlidingFragment; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;import&lt;/span&gt; com.os.activity.sliding.LeftFragment; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;import&lt;/span&gt; com.os.activity.sliding.RightFragment; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;import&lt;/span&gt; com.os.slidingmenu.R; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;import&lt;/span&gt; com.os.slidingmenu.SlidingMenu; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;import&lt;/span&gt; com.os.ui.MainHallFragment; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;import&lt;/span&gt; android.os.Bundle; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;import&lt;/span&gt; android.os.Handler; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;import&lt;/span&gt; android.os.Message; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;import&lt;/span&gt; android.support.v4.app.Fragment; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;import&lt;/span&gt; android.support.v4.app.FragmentManager; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;import&lt;/span&gt; android.support.v4.app.FragmentTransaction; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;public&lt;/span&gt; &lt;span class="hljs-class" style="box-sizing: border-box;"&gt;&lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;class&lt;/span&gt; &lt;span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);"&gt;MainActivity&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;extends&lt;/span&gt; &lt;span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);"&gt;BaseFragmentActivity&lt;/span&gt; {&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;private&lt;/span&gt; Fragment mCurFragment; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;public&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;static&lt;/span&gt; SlidingMenu mSlidingMenu; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;private&lt;/span&gt; Handler handler = &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;new&lt;/span&gt; MyHandler(&lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;this&lt;/span&gt;); &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;private&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;static&lt;/span&gt; &lt;span class="hljs-class" style="box-sizing: border-box;"&gt;&lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;class&lt;/span&gt; &lt;span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);"&gt;MyHandler&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;extends&lt;/span&gt; &lt;span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);"&gt;Handler&lt;/span&gt; {&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;private&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;final&lt;/span&gt; WeakReference&lt;MainActivity&gt; mActivity; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;public&lt;/span&gt; &lt;span class="hljs-title" style="box-sizing: border-box;"&gt;MyHandler&lt;/span&gt;(MainActivity activity) { mActivity = &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;new&lt;/span&gt; WeakReference&lt;MainActivity&gt;(activity); } &lt;span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;"&gt;@Override&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;public&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;void&lt;/span&gt; &lt;span class="hljs-title" style="box-sizing: border-box;"&gt;handleMessage&lt;/span&gt;(Message msg) { MainActivity activity = mActivity.get(); &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;if&lt;/span&gt; (activity == &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;null&lt;/span&gt;) { &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;return&lt;/span&gt;; } activity.handleMsg(msg); } } &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;private&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;void&lt;/span&gt; &lt;span class="hljs-title" style="box-sizing: border-box;"&gt;handleMsg&lt;/span&gt;(Message msg) { } &lt;span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;"&gt;@Override&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;protected&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;void&lt;/span&gt; &lt;span class="hljs-title" style="box-sizing: border-box;"&gt;onCreate&lt;/span&gt;(Bundle savedInstanceState) { &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;super&lt;/span&gt;.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initViews(); &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;if&lt;/span&gt; (savedInstanceState != &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;null&lt;/span&gt;) { mCurFragment = getSupportFragmentManager().getFragment(savedInstanceState, &lt;span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;"&gt;"mCurContent"&lt;/span&gt;); } } &lt;span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;"&gt;@Override&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;protected&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;void&lt;/span&gt; &lt;span class="hljs-title" style="box-sizing: border-box;"&gt;onSaveInstanceState&lt;/span&gt;(Bundle outState) { &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;super&lt;/span&gt;.onSaveInstanceState(outState); getSupportFragmentManager().putFragment(outState, &lt;span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;"&gt;"mCurContent"&lt;/span&gt;, mCurFragment); } &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;private&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;void&lt;/span&gt; &lt;span class="hljs-title" style="box-sizing: border-box;"&gt;initViews&lt;/span&gt;() {&lt;span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"&gt;// 通过id 找到slidingmenu &lt;/span&gt; mSlidingMenu = (SlidingMenu) findViewById(R.id.slidingmenu); mSlidingMenu.setMenu(R.layout.sliding_left_frame);&lt;span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"&gt;//给slidingmenu 添加左边的布局&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;if&lt;/span&gt; (getFragmentByTag(LeftFragment.class) == &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;null&lt;/span&gt;) {&lt;span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"&gt;//添加左边fragment&lt;/span&gt; getSupportFragmentManager().beginTransaction().add(R.id.left_frame, &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;new&lt;/span&gt; LeftFragment(), LeftFragment.class.getName()).commit(); } mSlidingMenu.setContent(R.layout.sliding_center_frame);&lt;span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"&gt;//添加一个空布局,后面承载 中间的fragment&lt;/span&gt; mSlidingMenu.setSecondaryMenu(R.layout.sliding_right_frame);&lt;span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"&gt;//添加右面的布局,添加右边的fragment&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;if&lt;/span&gt; (getFragmentByTag(RightFragment.class) == &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;null&lt;/span&gt;) { getSupportFragmentManager().beginTransaction().add(R.id.right_frame, &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;new&lt;/span&gt; RightFragment(), RightFragment.class.getName()).commit(); } &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;if&lt;/span&gt; (mCurFragment != &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;null&lt;/span&gt;) { postSwitchFragment(); } mSlidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);&lt;span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"&gt;//设置滑动模式,边缘 还是整个界面&lt;/span&gt; } &lt;span class="hljs-javadoc" style="color: rgb(136, 0, 0); box-sizing: border-box;"&gt;/** * slidingMenu中的内容Fragment切换(左侧菜单触发) * *&lt;span class="hljs-javadoctag" style="color: rgb(102, 0, 102); box-sizing: border-box;"&gt; @param&lt;/span&gt; clazz */&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;public&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;void&lt;/span&gt; &lt;span class="hljs-title" style="box-sizing: border-box;"&gt;switchCenterFragment&lt;/span&gt;(Class&lt;? extends Fragment&gt; clazz) { &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;try&lt;/span&gt; { &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;if&lt;/span&gt; (mSlidingMenu == &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;null&lt;/span&gt;) { removeAllFragments(); &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;return&lt;/span&gt;; } &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;boolean&lt;/span&gt; isInit = &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;false&lt;/span&gt;; FragmentManager fm = getSupportFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); Fragment userFragment = fm.findFragmentByTag(clazz.getName()); &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;if&lt;/span&gt; (userFragment == &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;null&lt;/span&gt;) { isInit = &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;true&lt;/span&gt;; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;try&lt;/span&gt; { userFragment = clazz.newInstance(); } &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;catch&lt;/span&gt; (InstantiationException e) { e.printStackTrace(); } &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;catch&lt;/span&gt; (IllegalAccessException e) { e.printStackTrace(); } &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;catch&lt;/span&gt; (Exception e) { e.printStackTrace(); } } &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;if&lt;/span&gt; (mCurFragment != &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;null&lt;/span&gt; mCurFragment != userFragment) { ft.hide(mCurFragment); } &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;if&lt;/span&gt; (!userFragment.isAdded() isInit) { ft.add(R.id.center_frame, userFragment, clazz.getName()); } &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;else&lt;/span&gt; { ft.show(userFragment); } ft.commitAllowingStateLoss(); mCurFragment = userFragment; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;if&lt;/span&gt; (MainHallFragment.class.getName().equals(clazz.getName())) { mSlidingMenu.setMode(SlidingMenu.LEFT_RIGHT); &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;if&lt;/span&gt; (!isInit) { ((MainHallFragment) userFragment).postScrollTop(); } } &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;else&lt;/span&gt; { mSlidingMenu.setMode(SlidingMenu.LEFT_RIGHT); } postShowContent(&lt;span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;"&gt;200&lt;/span&gt;); } &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;catch&lt;/span&gt; (Exception e) { e.printStackTrace(); } } &lt;span class="hljs-javadoc" style="color: rgb(136, 0, 0); box-sizing: border-box;"&gt;/** * lidingMenu中的内容Fragment内容过滤(右侧菜单触发) * *&lt;span class="hljs-javadoctag" style="color: rgb(102, 0, 102); box-sizing: border-box;"&gt; @param&lt;/span&gt; clazz *&lt;span class="hljs-javadoctag" style="color: rgb(102, 0, 102); box-sizing: border-box;"&gt; @param&lt;/span&gt; type */&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;public&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;void&lt;/span&gt; &lt;span class="hljs-title" style="box-sizing: border-box;"&gt;filterCenterFragment&lt;/span&gt;(Class&lt;? extends BaseSlidingFragment&gt; clazz, &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;int&lt;/span&gt; type) { BaseSlidingFragment userFragment = (BaseSlidingFragment) getFragmentByTag(clazz); &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;if&lt;/span&gt; (userFragment != &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;null&lt;/span&gt;) { userFragment.filter(type); } &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;if&lt;/span&gt; (mSlidingMenu != &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;null&lt;/span&gt;) mSlidingMenu.showContent(); } &lt;span class="hljs-javadoc" style="color: rgb(136, 0, 0); box-sizing: border-box;"&gt;/** * 延迟切换Fragment */&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;private&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;void&lt;/span&gt; &lt;span class="hljs-title" style="box-sizing: border-box;"&gt;postSwitchFragment&lt;/span&gt;() { handler.postDelayed(&lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;new&lt;/span&gt; Runnable() { &lt;span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;"&gt;@Override&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;public&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;void&lt;/span&gt; &lt;span class="hljs-title" style="box-sizing: border-box;"&gt;run&lt;/span&gt;() { switchCenterFragment(mCurFragment.getClass()); } }, &lt;span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;"&gt;50&lt;/span&gt;); } &lt;span class="hljs-javadoc" style="color: rgb(136, 0, 0); box-sizing: border-box;"&gt;/** * 清除FragmentManager中所有Fragment */&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;private&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;void&lt;/span&gt; &lt;span class="hljs-title" style="box-sizing: border-box;"&gt;removeAllFragments&lt;/span&gt;() { FragmentManager fm = getSupportFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;for&lt;/span&gt; (&lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;int&lt;/span&gt; i = &lt;span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;"&gt;0&lt;/span&gt;; i &lt; LeftFragment.FRAGMENTS_CLASSES.length; i++) { Fragment fragment = getFragmentByTag(LeftFragment.FRAGMENTS_CLASSES[i].getName()); &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;if&lt;/span&gt; (fragment != &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;null&lt;/span&gt;) { ft.remove(fragment); } } ft.commitAllowingStateLoss(); } &lt;span class="hljs-javadoc" style="color: rgb(136, 0, 0); box-sizing: border-box;"&gt;/** * 延时mSlidingMenu.showContent() * *&lt;span class="hljs-javadoctag" style="color: rgb(102, 0, 102); box-sizing: border-box;"&gt; @param&lt;/span&gt; delayMillis 延时时间 单位毫秒 */&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;private&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;void&lt;/span&gt; &lt;span class="hljs-title" style="box-sizing: border-box;"&gt;postShowContent&lt;/span&gt;(&lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;long&lt;/span&gt; delayMillis) { handler.postDelayed(&lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;new&lt;/span&gt; Runnable() { &lt;span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;"&gt;@Override&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;public&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;void&lt;/span&gt; &lt;span class="hljs-title" style="box-sizing: border-box;"&gt;run&lt;/span&gt;() { &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;if&lt;/span&gt; (mSlidingMenu!=&lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;null&lt;/span&gt; !MainActivity.&lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;this&lt;/span&gt;.isFinishing()) { mSlidingMenu.showContent(); } } }, delayMillis); } } /* * 提示:该行代码过长,系统自动注释不进行高亮。一键复制会移除系统注释 * &lt;/code&gt;&lt;ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;1&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;2&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;3&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;4&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;5&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;6&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;7&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;8&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;9&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;10&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;11&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;12&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;13&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;14&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;15&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;16&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;17&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;18&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;19&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;20&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;21&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;22&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;23&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;24&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;25&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;26&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;27&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;28&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;29&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;30&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;31&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;32&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;33&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;34&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;35&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;36&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;37&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;38&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;39&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;40&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;41&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;42&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;43&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;44&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;45&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;46&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;47&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;48&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;49&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;50&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;51&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;52&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;53&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;54&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;55&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;56&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;57&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;58&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;59&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;60&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;61&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;62&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;63&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;64&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;65&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;66&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;67&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;68&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;69&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;70&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;71&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;72&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;73&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;74&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;75&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;76&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;77&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;78&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;79&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;80&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;81&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;82&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;83&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;84&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;85&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;86&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;87&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;88&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;89&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;90&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;91&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;92&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;93&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;94&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;95&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;96&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;97&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;98&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;99&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;100&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;101&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;102&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;103&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;104&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;105&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;106&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;107&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;108&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;109&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;110&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;111&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;112&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;113&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;114&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;115&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;116&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;117&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;118&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;119&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;120&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;121&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;122&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;123&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;124&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;125&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;126&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;127&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;128&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;129&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;130&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;131&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;132&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;133&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;134&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;135&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;136&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;137&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;138&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;139&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;140&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;141&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;142&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;143&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;144&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;145&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;146&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;147&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;148&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;149&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;150&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;151&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;152&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;153&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;154&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;155&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;156&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;157&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;158&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;159&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;160&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;161&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;162&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;163&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;164&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;165&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;166&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;167&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;168&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;169&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;170&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;171&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;172&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;173&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;174&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;175&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;176&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;177&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;178&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;179&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;180&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;181&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;182&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;183&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;184&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;185&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;186&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;187&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;188&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;189&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;190&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;191&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;192&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;193&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;194&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;195&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;196&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;197&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;198&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;199&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;200&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;201&lt;/li&gt;&lt;/ul&gt; */ 左边的fragment代码语言:javascript复制&lt;code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"&gt;&lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;package&lt;/span&gt; com.os.activity.sliding; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;import&lt;/span&gt; java.util.Arrays; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;import&lt;/span&gt; com.os.activity.MainActivity; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;import&lt;/span&gt; com.os.activity.base.BaseSlidingFragment; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;import&lt;/span&gt; com.os.slidingmenu.R; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;import&lt;/span&gt; com.os.ui.FollowFragment; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;import&lt;/span&gt; com.os.ui.MainHallFragment; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;import&lt;/span&gt; com.os.ui.RankFragment; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;import&lt;/span&gt; android.app.ProgressDialog; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;import&lt;/span&gt; android.graphics.Bitmap; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;import&lt;/span&gt; android.graphics.BitmapFactory; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;import&lt;/span&gt; android.graphics.Color; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;import&lt;/span&gt; android.os.Bundle; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;import&lt;/span&gt; android.support.v4.app.Fragment; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;import&lt;/span&gt; android.text.Spannable; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;import&lt;/span&gt; android.text.SpannableStringBuilder; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;import&lt;/span&gt; android.text.style.ForegroundColorSpan; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;import&lt;/span&gt; android.view.Gravity; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;import&lt;/span&gt; android.view.View; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;import&lt;/span&gt; android.view.View.OnClickListener; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;import&lt;/span&gt; android.view.ViewGroup.LayoutParams; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;import&lt;/span&gt; android.widget.Button; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;import&lt;/span&gt; android.widget.ImageView; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;import&lt;/span&gt; android.widget.LinearLayout; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;import&lt;/span&gt; android.widget.PopupWindow; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;import&lt;/span&gt; android.widget.TextView; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;import&lt;/span&gt; android.widget.Toast; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;public&lt;/span&gt; &lt;span class="hljs-class" style="box-sizing: border-box;"&gt;&lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;class&lt;/span&gt; &lt;span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);"&gt;LeftFragment&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;extends&lt;/span&gt; &lt;span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);"&gt;BaseSlidingFragment&lt;/span&gt; {&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;private&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;final&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;static&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;int&lt;/span&gt; MENU_NORMAL_ICONS[] = { R.drawable.sliding_livehall_icon_normal, R.drawable.sliding_follow_icon_normal, R.drawable.sliding_rank_icon_normal}; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;private&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;final&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;static&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;int&lt;/span&gt; MENU_CHECKED_ICONS[] = { R.drawable.sliding_livehall_icon_checked, R.drawable.sliding_follow_icon_checked, R.drawable.sliding_rank_icon_checked }; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;public&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;final&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;static&lt;/span&gt; Class[] FRAGMENTS_CLASSES = { MainHallFragment.class, FollowFragment.class, RankFragment.class};&lt;span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"&gt;//左侧切换显示中间的三个界面&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;private&lt;/span&gt; View[] mMenuLayouts; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;private&lt;/span&gt; ImageView[] mMenuIcons; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;private&lt;/span&gt; TextView[] mMenuTexts; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;private&lt;/span&gt; Bitmap mLoadingBitmap; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;private&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;int&lt;/span&gt; mCurrentIndex = -&lt;span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;"&gt;1&lt;/span&gt;; &lt;span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;"&gt;@Override&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;public&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;void&lt;/span&gt; &lt;span class="hljs-title" style="box-sizing: border-box;"&gt;onCreate&lt;/span&gt;(Bundle savedInstanceState) { &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;super&lt;/span&gt;.onCreate(savedInstanceState); setContentView(R.layout.sliding_left); setData(); changeMenuByClass(MainHallFragment.class);&lt;span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"&gt;//默认中间的界面显示的是这个MainHallFragment&lt;/span&gt; } &lt;span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;"&gt;@Override&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;public&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;void&lt;/span&gt; &lt;span class="hljs-title" style="box-sizing: border-box;"&gt;initViews&lt;/span&gt;() { mMenuLayouts = &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;new&lt;/span&gt; View[] { findViewById(R.id.menu_livehall_layout), findViewById(R.id.menu_follow_layout), findViewById(R.id.menu_rank_layout) }; mMenuIcons = &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;new&lt;/span&gt; ImageView[] { (ImageView) findViewById(R.id.menu_livehall_icon), (ImageView) findViewById(R.id.menu_follow_icon), (ImageView) findViewById(R.id.menu_rank_icon) }; mMenuTexts = &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;new&lt;/span&gt; TextView[] { (TextView) findViewById(R.id.menu_livehall_text), (TextView) findViewById(R.id.menu_follow_text), (TextView) findViewById(R.id.menu_rank_text),}; } &lt;span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;"&gt;@Override&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;public&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;void&lt;/span&gt; &lt;span class="hljs-title" style="box-sizing: border-box;"&gt;addListener&lt;/span&gt;() { &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;for&lt;/span&gt; (&lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;int&lt;/span&gt; i = &lt;span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;"&gt;0&lt;/span&gt;; i &lt; mMenuLayouts.length; i++) { mMenuLayouts[i].setTag(i); mMenuLayouts[i].setOnClickListener(&lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;new&lt;/span&gt; OnClickListener() { &lt;span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;"&gt;@Override&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;public&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;void&lt;/span&gt; &lt;span class="hljs-title" style="box-sizing: border-box;"&gt;onClick&lt;/span&gt;(View v) { &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;int&lt;/span&gt; index = (Integer) v.getTag(); changeMenuByIndex(index); } }); } } &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;private&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;void&lt;/span&gt; &lt;span class="hljs-title" style="box-sizing: border-box;"&gt;setData&lt;/span&gt;() { } &lt;span class="hljs-javadoc" style="color: rgb(136, 0, 0); box-sizing: border-box;"&gt;/** * 通过索引改变Menu * *&lt;span class="hljs-javadoctag" style="color: rgb(102, 0, 102); box-sizing: border-box;"&gt; @param&lt;/span&gt; index */&lt;/span&gt; &lt;span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;"&gt;@SuppressWarnings&lt;/span&gt;(&lt;span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;"&gt;"unchecked"&lt;/span&gt;) &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;private&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;void&lt;/span&gt; &lt;span class="hljs-title" style="box-sizing: border-box;"&gt;changeMenuByIndex&lt;/span&gt;(&lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;int&lt;/span&gt; index) { Class&lt;? extends Fragment&gt; clazz = &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;null&lt;/span&gt;; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;if&lt;/span&gt; (mCurrentIndex != index) { clearMenu(); setMenuChecked(index); } clazz = FRAGMENTS_CLASSES[index]; getFragmentActivity(MainActivity.class).switchCenterFragment(clazz); mCurrentIndex = index; } &lt;span class="hljs-javadoc" style="color: rgb(136, 0, 0); box-sizing: border-box;"&gt;/** * 通过Fragment类改变menu * *&lt;span class="hljs-javadoctag" style="color: rgb(102, 0, 102); box-sizing: border-box;"&gt; @param&lt;/span&gt; clazz */&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;public&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;void&lt;/span&gt; &lt;span class="hljs-title" style="box-sizing: border-box;"&gt;changeMenuByClass&lt;/span&gt;(Class&lt;? extends Fragment&gt; clazz) { &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;int&lt;/span&gt; index = Arrays.asList(FRAGMENTS_CLASSES).indexOf(clazz); &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;if&lt;/span&gt; (index != -&lt;span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;"&gt;1&lt;/span&gt;) { changeMenuByIndex(index); } } &lt;span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;"&gt;@SuppressWarnings&lt;/span&gt;(&lt;span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;"&gt;"deprecation"&lt;/span&gt;) &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;private&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;void&lt;/span&gt; &lt;span class="hljs-title" style="box-sizing: border-box;"&gt;clearMenu&lt;/span&gt;() { &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;for&lt;/span&gt; (&lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;int&lt;/span&gt; i = &lt;span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;"&gt;1&lt;/span&gt;; i &lt;= mMenuLayouts.length; i++) { mMenuLayouts[i-&lt;span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;"&gt;1&lt;/span&gt;].setBackgroundDrawable(&lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;null&lt;/span&gt;); mMenuIcons[i - &lt;span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;"&gt;1&lt;/span&gt;].setImageResource(MENU_NORMAL_ICONS[i - &lt;span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;"&gt;1&lt;/span&gt;]); mMenuTexts[i - &lt;span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;"&gt;1&lt;/span&gt;].setTextColor(getResources().getColor(R.color.gray7)); } } &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;private&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;void&lt;/span&gt; &lt;span class="hljs-title" style="box-sizing: border-box;"&gt;setMenuChecked&lt;/span&gt;(&lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;int&lt;/span&gt; index) { &lt;span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"&gt;// if (index == 0) {&lt;/span&gt; &lt;span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"&gt;// return;&lt;/span&gt; &lt;span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"&gt;// }&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;if&lt;/span&gt; (index != &lt;span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;"&gt;1&lt;/span&gt; index != &lt;span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;"&gt;2&lt;/span&gt;) { mMenuLayouts[index].setBackgroundResource(R.drawable.sliding_menu_checked_bg); } mMenuIcons[index ].setImageResource(MENU_CHECKED_ICONS[index ]); mMenuTexts[index ].setTextColor(getResources().getColor(R.color.white)); } &lt;span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;"&gt;@Override&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;public&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;void&lt;/span&gt; &lt;span class="hljs-title" style="box-sizing: border-box;"&gt;onDestroy&lt;/span&gt;() { &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;if&lt;/span&gt; (mLoadingBitmap != &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;null&lt;/span&gt; !mLoadingBitmap.isRecycled()) { mLoadingBitmap.recycle(); mLoadingBitmap = &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;null&lt;/span&gt;; } &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;super&lt;/span&gt;.onDestroy(); } } /* * 提示:该行代码过长,系统自动注释不进行高亮。一键复制会移除系统注释 * &lt;/code&gt;&lt;ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;1&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;2&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;3&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;4&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;5&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;6&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;7&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;8&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;9&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;10&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;11&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;12&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;13&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;14&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;15&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;16&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;17&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;18&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;19&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;20&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;21&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;22&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;23&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;24&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;25&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;26&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;27&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;28&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;29&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;30&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;31&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;32&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;33&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;34&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;35&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;36&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;37&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;38&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;39&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;40&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;41&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;42&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;43&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;44&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;45&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;46&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;47&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;48&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;49&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;50&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;51&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;52&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;53&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;54&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;55&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;56&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;57&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;58&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;59&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;60&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;61&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;62&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;63&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;64&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;65&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;66&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;67&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;68&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;69&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;70&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;71&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;72&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;73&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;74&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;75&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;76&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;77&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;78&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;79&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;80&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;81&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;82&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;83&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;84&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;85&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;86&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;87&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;88&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;89&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;90&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;91&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;92&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;93&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;94&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;95&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;96&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;97&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;98&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;99&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;100&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;101&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;102&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;103&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;104&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;105&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;106&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;107&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;108&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;109&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;110&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;111&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;112&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;113&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;114&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;115&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;116&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;117&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;118&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;119&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;120&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;121&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;122&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;123&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;124&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;125&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;126&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;127&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;128&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;129&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;130&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;131&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;132&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;133&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;134&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;135&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;136&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;137&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;138&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;139&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;140&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;141&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;142&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;143&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;144&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;145&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;146&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;147&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;148&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;149&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;150&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;151&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;152&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;153&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;154&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;155&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;156&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;157&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;158&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;159&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;160&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;161&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;162&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;163&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;164&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;165&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;166&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;167&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;168&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;169&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;170&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;171&lt;/li&gt;&lt;li style="box-sizing: border-box; padding: 0px 5px;"&gt;172&lt;/li&gt;&lt;/ul&gt; */ 主要就是 oncreate 中 初始化 刚启动应用后中间显示的fragment 是 MainHallFragment. 视频时RTMP 协议,解码用的ffmpeg. 代码就不贴了,在工程的jni 目录下,都有注释。 聊天的代码 聊天室界面是 ChatroomActivity. 这是 一初始化MultiUserChat 聊天室对象的代码,具体代码 ,在这个类里面。代码语言:javascript复制&lt;code class="hljs axapta has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"&gt;&lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;new&lt;/span&gt; Thread() { &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;public&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;void&lt;/span&gt; run() { &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;try&lt;/span&gt; { Thread.sleep(&lt;span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;"&gt;1&lt;/span&gt; * &lt;span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;"&gt;1000&lt;/span&gt;); } &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;catch&lt;/span&gt; (InterruptedException e) { e.printStackTrace(); } &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;int&lt;/span&gt; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;count&lt;/span&gt; = &lt;span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;"&gt;0&lt;/span&gt;; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;boolean&lt;/span&gt; isRandom = &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;false&lt;/span&gt;; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;while&lt;/span&gt; (&lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;count&lt;/span&gt; &lt;= &lt;span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;"&gt;10&lt;/span&gt; !create_flag) { &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;count&lt;/span&gt;++; &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;try&lt;/span&gt; { &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;if&lt;/span&gt; (mHostInfo != &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;null&lt;/span&gt;) { mUserNickName = getNickName(isRandom); muc = ConnectionUtils.getMultiUserChat(mHostInfo.room_id, mHostInfo.room_service, mUserNickName, mPassword, ChatroomActivity.&lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;this&lt;/span&gt;); &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;if&lt;/span&gt; (muc != &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;null&lt;/span&gt;) { create_flag = &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;true&lt;/span&gt;; &lt;span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"&gt;// 创建聊天室成功,监听聊天室返回的消息&lt;/span&gt; &lt;span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"&gt;// 监听消息&lt;/span&gt; muc.addMessageListener(packetListener); &lt;span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"&gt;// muc.addParticipantListener(participantListener);&lt;/span&gt; muc.addParticipantStatusListener(statusListener); muc.addUserStatusListener(userStatusListener); mHandler.sendEmptyMessageDelayed(&lt;span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;"&gt;9&lt;/span&gt;, &lt;span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;"&gt;500&lt;/span&gt;); } &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;else&lt;/span&gt; { create_flag = &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;false&lt;/span&gt;; } } &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;else&lt;/span&gt; { create_flag = &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;false&lt;/span&gt;; } &lt;span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"&gt;// } else {&lt;/span&gt; &lt;span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"&gt;//&lt;/span&gt; &lt;span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"&gt;// }&lt;/span&gt; } &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;catch&lt;/span&gt; (NotFoundException e) { e.printStackTrace(); } &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;catch&lt;/span&gt; (SameException e) {&lt;span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"&gt;// 昵称重复&lt;/span&gt; isRandom = &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;true&lt;/span&gt;; } &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;catch&lt;/span&gt; (BannedException e) {&lt;span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"&gt;// 禁止加入房间&lt;/span&gt; sendBandHandle(&lt;span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;"&gt;15&lt;/span&gt;); &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;return&lt;/span&gt;; } &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;catch&lt;/span&gt; (XMPPException e) { e.printStackTrace(); } &lt;span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;"&gt;catch&lt;/span&gt; (Exception e) { e.printStackTrace(); } }&lt;/code&gt;
Flarum搭建论坛详细教程
Flarum搭建论坛详细教程
1、关于Flarum程序完美支持军哥lnmp环境/宝塔等,下载程序上传到网站根目录并需要伪静态+fileinfo扩展。程序本地下载:FlarumChina-beta7.zipGithub下载地址:https://github.com/skywalker512/FlarumChinafileinfo拓展 需要支持php扩展fileinfo。 1、对于lnmp1.3默认没有支持。修改include/upgrade_php.sh这个文件,把其中的:--disable-fileinfo,全部替换:--enable-fileinfo,再执行./upgrade.sh升级php就行了。 2、对于宝塔,安装后,找到你的PHP程序,里面有扩展可以选择安装。2、centos安装LNMP支持flarun2 | 1 数据库安装代码语言:javascript复制sudo wget https://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm yum -y install mysql57-community-release-el7-10.noarch.rpm yum -y install mysql-community-server systemctl start mysqld.service2 | 2 mysql5.7获取密码的方式代码语言:javascript复制sudo grep 'temporary password' /var/log/mysqld.log代码语言:javascript复制vi /etc/my.cnf代码语言:javascript复制#添加validate_password_policy配置 validate_password_policy=0 #关闭密码策略 validate_password = off修改root密码代码语言:javascript复制mysql -uroot -p密码代码语言:javascript复制set global validate_password_policy=0; set global validate_password_length=1; ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!'; grant all privileges on *.* to root@"%" identified by "new password"; flush privileges;代码语言:javascript复制systemctl restart mysql2 | 3 安装php7.2代码语言:javascript复制sudo rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm sudo rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm yum install php72w-fpm php72w-cli php72w-curl php72w-dom php72w-gd php72w-json php72w-mbstring php72w-openssl php72w-pdo_mysql php72w-tokenizer php72w-zip -y代码语言:javascript复制vim /etc/php-fpm.d/www.conf代码语言:javascript复制#找到以下两处共四行代码并修改如下: user = nginx group = nginx listen.owner = nginx listen.group = nginx3、安装Flarum方法一:下载=即使用整合包https://github.com/skywalker512/FlarumChina/releases/tag/v0.1.0-beta.12方法二:composer拉取 (比较建议后面装插件都是用的composer)3 | 1 安装composer下载composer.phar, 如果是网络原因失败,多试几次代码语言:javascript复制curl -sS https://getcomposer.org/installer | php把composer.phar移动到环境下让其变成可执行:代码语言:javascript复制mv composer.phar /usr/local/bin/composer测试代码语言:javascript复制composer -v修改镜像地址代码语言:javascript复制composer config repo.packagist composer https://mirrors.aliyun.com/composer/3 | 2 安装ningx代码语言:javascript复制yum -y install nginx unzip进入wwwroot目录中使用composer命令来安装flarum:代码语言:javascript复制mkdir /var/www/flarum/ cd /var/www/flarum/代码语言:javascript复制composer create-project flarum/flarum . --stability=beta #不用使用管理员权限命令sudo。完毕后修改nginx中的默认配置文件:代码语言:javascript复制sudo vim /etc/nginx/nginx.conf代码语言:javascript复制#将server代码段下的所有代码都用#注释掉 #server { # listen 80 default_server; # listen [::]:80 default_server; # server_name _; # root /usr/share/nginx/html; # # Load configuration files for the default server block. # include /etc/nginx/default.d/*.conf; # location / { # } # error_page 404 /404.html; # location = /40x.html { # } # error_page 500 502 503 504 /50x.html; # location = /50x.html { # } #} #然后修改 server { listen 80; server_name your.website.url; root /var/www/flarum/public; index index.php index.html; #include /home/flarum/wwwroot/.nginx.conf; location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } location / { try_files $uri $uri/ /index.php?$query_string; } # The following directives are based on best practices from H5BP Nginx Server Configs # https://github.com/h5bp/server-configs-nginx # Expire rules for static content location ~* \.(?:manifest|appcache|html?|xml|json)$ { add_header Cache-Control "max-age=0"; } location ~* \.(?:rss|atom)$ { add_header Cache-Control "max-age=3600"; } location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|mp4|ogg|ogv|webm|htc)$ { add_header Cache-Control "max-age=2592000"; access_log off; } location ~* \.(?:css|js)$ { add_header Cache-Control "max-age=31536000"; access_log off; } location ~* \.(?:ttf|ttc|otf|eot|woff|woff2)$ { add_header Cache-Control "max-age=2592000"; access_log off; } # Gzip compression gzip on; gzip_comp_level 5; gzip_min_length 256; gzip_proxied any; gzip_vary on; gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy; }注意:因为Flarum遵守了最新的安全规范,其程序的运行目录其实是在public文件夹内。4、插件安装https://bbs.csur.fun/d/84-flarum5、虚拟机搭建买个虚拟机做网页,诸多限制,虚拟机服务商的提供的服务确实就两字“操蛋”。 为什么没有买云服务器?就两字 “没钱”!哈哈。 虚拟机的购买途径自寻,但是很多服务商真的很坑爹。 虚拟机要求php支持7.2以上mysql支持5.7以上能够支持更改网站跟目录6、更改网站根目录层级将 public 目录(包括 .htaccess)中的所有文件移动到 Flarum 根目录。然后编辑 .htaccess 取消第 9-14 行的注释,以保护敏感资源。 然后编辑 index.php 文件,更改以下行:代码语言:javascript复制$site = require './site.php';最后,在 site.php 更新路径,以反映新的目录结构:代码语言:javascript复制'base' =&gt; __DIR__, 'public' =&gt; __DIR__, 'storage' =&gt; __DIR__.'/storage',config.php 更新 url 路径代码语言:javascript复制'url' =&gt; 'https://xxx.com/community',不更改网站层级目录请根据你的虚拟主机面板的不同,将网站运行目录指向public文件夹。 如果您使用的是虚拟主机无法更改目录,请按照一下的方法进行设置 在根目录下新建一个名为 .htaccess的文件代码语言:javascript复制RewriteEngine on RewriteCond %{REQUEST_URI} !^/public/ RewriteRule ^(.*)$ /public/$1 [L]7、其他底部加统计代码语言:javascript复制vendor/flarum/core/views/app.blade.php去掉网络字体代码语言:javascript复制vendor/flarum/core/src/Http/WebApp/WebAppView.php伪静态设置Nginx的话在站点配置文件处添加下面一段话。代码语言:javascript复制location / { try_files $uri $uri/ /index.php?$query_string; } location /api { try_files $uri $uri/ /api.php?$query_string; } location /admin { try_files $uri $uri/ /admin.php?$query_string; } location /flarum { deny all; return 404; } location ~ .php$ { fastcgi_split_path_info ^(.+.php)(/.+)$; fastcgi_pass unix:/tmp/php-cgi.sock; fastcgi_index index.php; include fastcgi.conf; }
一些关于网站推广问题合集。
一些关于网站推广问题合集。
网站怎么快速上权重?要让一个网站快速提高权重,需要实施以下一些有效的策略:提供高质量的内容:提供高质量、原创、有用的内容是最重要的。这可以吸引更多的用户访问,并增加用户留存时间,提高用户体验。同时,高质量的内容也会被其他网站引用和分享,这将有助于增加外部链接,提高网站的权重。内部链接优化:内部链接是指在网站内部不同页面之间的链接。通过优化内部链接结构,可以增加搜索引擎对网站的理解,提高网站权重。在内部链接时,要使用相关的关键字作为链接文本,而不是使用"点击这里"这样无意义的链接文本。外部链接建设:获取来自其他网站的高质量链接对于提高网站权重非常重要。可以通过主动进行友情链接、媒体报道、论坛发帖等方式增加外部链接。但是请注意,建立外部链接是需要花费时间和精力的,必须确保链接是高质量的、自然的,否则可能会适得其反。社交媒体推广:在社交媒体平台上建立专业的社交媒体账号,提供网站相关的信息、文章、图像、视频等,让更多的用户了解网站,增加网站的曝光度,进而增加网站权重。网站结构优化:优化网站结构可以帮助搜索引擎更好地抓取和理解网站内容,提高网站权重。可以通过优化网站的HTML代码结构、网站的目录结构、网站的图片和视频的优化等方式实现。需要注意的是,这些策略需要长期坚持和不断完善,才能够取得长期、稳定的效果。怎么养站?要养好一个网站,需要考虑以下几个方面:网站内容:一个网站需要有高质量、有价值的内容来吸引用户。内容可以是文字、图片、视频等形式,需要有足够的量和质量,同时需要及时更新。网站设计:网站的设计需要符合用户的视觉需求,界面简洁、易于操作、美观大方,同时需要考虑不同设备(如手机、平板、电脑)的适配。网站优化:通过搜索引擎优化(SEO)、网站性能优化(如减少页面加载时间)、提高用户体验(如减少广告干扰),来提高网站的流量和用户满意度。社交媒体:通过社交媒体来吸引用户,增加网站的曝光率和影响力,比如可以在微信公众号、微博、知乎等平台上发布内容,吸引用户关注。安全保护:确保网站的安全性,包括用户信息保护、反垃圾邮件、反病毒等安全措施。数据分析:通过数据分析工具,了解用户访问情况,优化网站的运营,提高用户满意度和转化率。综合考虑上述因素,不断更新和改进,就可以养好一个网站。网站怎么发外链有用?要使外链对你的网站有用,你需要遵循以下几个步骤:确定目标受众和内容:确定你要向哪些人推广内容,以及他们可能对哪些内容感兴趣。通过创建高质量的内容,吸引用户来阅读你的文章并点击你的链接。找到相关的网站:寻找与你的内容相关的网站,并联系网站所有者以获得一个外链。你可以通过搜索引擎、社交媒体、行业博客等方式来找到这些网站。站长百科网创建有价值的内容:创建有价值的内容可以吸引其他网站链接到你的网站。确保你的内容是高质量的,包含有用的信息,且易于阅读和分享。联系其他网站:直接联系其他网站的所有者,请求他们在他们的网站上添加你的链接。你可以通过电子邮件、社交媒体或其他渠道来联系他们。使用社交媒体:在社交媒体上分享你的内容,并鼓励其他用户分享你的文章。这样可以提高你的内容的曝光率,并吸引更多的用户来访问你的网站。需要注意的是,对于外链的数量和质量,搜索引擎有一定的要求,如果采用不当的方式获取外链,可能会对你的网站产生负面影响。因此,你需要遵守搜索引擎的规则,采用合法的方式获取外链,从而为你的网站带来更多的流量和排名提升。2023年建什么类型的网站有前景?2023年,移动端和云端应用程序将继续受到极大的关注,尤其是基于AI的应用程序。有预测认为,2023年将会出现大量的智能家居、自动驾驶、语音助手等应用,这些网站将具有更大的前景。收藏 | 0点赞 | 0打赏
互联网论坛
红鲱鱼发布欧洲100佳创业企业名单
红鲱鱼发布欧洲100佳创业企业名单
红鲱鱼欧洲100佳创业企业评选活动上周在阿姆斯特丹结束,这次活动评出了欧洲100家最具潜力的创业企业。此次论坛讨论了2016年及未来几年欧洲创业者面临的前景。众多顶级投资人参与了讨论,指导创业企业如何吸引合适的投资机构。演讲嘉宾和听众都认为在欧洲融资仍然是主要挑战,这对于创业者来说尤其重要。论坛讨论结束,企业开始登台宣讲,评选标准和去年一样严格。参与评选的企业来自整个欧洲,从俄罗斯到法国到英国到德国。这100家最佳企业都是经过严格的层层筛选评出的,荣誉来之不易,也是众望所归。这些企业来自不同的领域,他们在欧洲以及全球市场的发展将备受瞩目,也会受到密切跟踪。 2016年欧洲100佳创业企业榜单公司行业国家12Return软件荷兰3megawatt GmbH清洁技术德国4th Office云技术英国6Tribes社交媒体英国Acast AB娱乐媒体瑞典Accellta Ltd生命科学/生物技术以色列Agiboo BV云技术荷兰agile42其他德国Anders Innovations网络/互联网芬兰Appentra Solutions软件西班牙arivis AG软件德国Beyond Sports虚拟技术荷兰Billage云技术西班牙Biovotion AG医疗设备瑞士BISEES INFORMATION SYSTEMS软件爱尔兰CARENITY社交媒体法国CloudEndure云技术以色列Compliance Risks专业服务爱尔兰Create Intelligence Ltd软件/分析英国Cree GmbH清洁技术奥地利CropX云技术以色列DCA (Data-Centric Alliance)大数据/存储俄罗斯Diviac AG互联网/网络瑞士EasyPark Group其他瑞典Educated Change Ltd娱乐媒体英国Enso Detego GmbH软件奥地利eSMART Technologies清洁技术瑞士EVRYTHNG云技术英国Fairsail云技术英国Featurespace其他英国FINALCAD软件法国GetIntent广告技术美国Grapeshot软件英国GuardSquare网络安全比利时HeadSense Medical医疗设备以色列HELLO STAGE娱乐媒体美国Herta Security网络安全西班牙High-Tech Bridge网络安全瑞士homePad Solutions互联网/网络瑞士ICS2大数据/存储以色列ID Finance银行/并购西班牙indoo.rs GmbH软件奥地利Kameleoon广告技术法国Keypasco网络安全瑞典KTH Event Agency清洁技术土耳其Lemon Way互联网/网络法国Leverate软件以色列LibraEsva Srl网络安全意大利MediSapiens Ltd生命科学/生物技术芬兰MeetApp AB移动技术瑞典Metafused Ltd广告技术英国moblin大数据/软件/广告技术以色列Mols Media BV软件荷兰MYMobile Security网络安全英国nestpick其他德国Nexthink软件瑞士OneSoon Limited软件英国Openhost, SL云技术西班牙Optimal Plus大数据/存储以色列OurCrowd风险资本/投资以色列Overleaf云技术英国P.I.Works电讯土耳其Padawan Ltd网络英国Parx Plastics BV清洁技术荷兰PleaseTech Ltd软件英国Polar OLED Ltd硬件英国Privatequity.biz互联网/网络以色列Productsup GmbH软件德国Pyreos Limited硬件英国Qosmos软件法国QUASARDB软件法国Radisens Diagnostics医疗设备爱尔兰rational motion清洁技术德国RedCloud Technologies软件英国Relay42云技术荷兰Roima Intelligence其他芬兰Securosys SA网络安全瑞士Sentiance软件比利时Shadow Technologies网络/互联网以色列Smoltek AB纳米技术瑞典Spideo软件法国Sportswik AB娱乐媒体dia瑞典Stratoscale虚拟技术以色列Takeaway.com B.V.网络/互联网荷兰Teamnet Group软件罗马尼亚The Nostrum Group Ltd软件英国TimeLog A/S软件丹麦Tinitell电讯瑞典TitanHQ网络安全爱尔兰Umbilical Design其他瑞典VATBOX云技术英国Venture Spirit云技术比利时VerseOne软件英国Visma Solutions Oy云技术芬兰Wax Digital Ltd云技术英国网络lib大数据/存储法国WeekCal BV移动技术荷兰Zapgocharger Ltd消费电子英国Zebra Medical Vision生命科学/生物技术以色列ZeroLight软件英国
《中国网络媒体的未来2014》71页PPT
《中国网络媒体的未来2014》71页PPT
点击标题下「大数据文摘」可快捷关注[摘要]腾讯科技企鹅智酷栏目与中国人民大学新闻学院新媒体研究所共同发布了移动媒体趋势报告《中国网络媒体的未来2014》11月12日下午,“2014腾讯网媒体高峰论坛”在北京举行。腾讯科技企鹅智酷栏目与中国人民大学新闻学院新媒体研究所共同发布了移动媒体趋势报告《中国网络媒体的未来2014》。中国人民大学新闻学院教授彭兰做了演讲。以下是彭兰的演讲要点。报告指出,移动互联网正是我们要面对的未来,这在中国尤为明显。2014年6月,中国手机上网比例首次超过PC机上网比例,手机网民的规模超过了八成。在移动时代,媒体的疆域也在拓展。移动媒体就等于新闻客户端?当然不是。移动媒体=内容媒体+关系媒体+服务媒体。中国移动媒体升级综合新闻客户端仍然是用户首选。每天多次打开新闻客户端的用户占比达到了77.5%。新闻客户端形式的革新:新闻客户端对内容品质要求越来越高,比肩甚至超越传统媒体。短板:在移动端如何平衡轻量化阅读和深度内容,仍是需要持续优化之处。综合新闻客户端机会有限,但在垂直领域可谓空间广阔。时政、财经、科技等领域拥有天然的关注度和广泛的信息数据,可称为垂直移动应用的新窗口。移动自媒体:公众号成催化剂在微信平台上,平均每天人均阅读文章5.86篇。日均阅读文章数超过3篇的用户占比达到51%。自媒体面临可持续化的挑战。1.受政策、平台因素影响大;2.需要高度的自我规范与自我约束;3.专业能力决定生存能力。中国用户如何使用移动媒体?近半数用户使用移动终端每天超过3小时。近七成用户更多使用移动终端阅读新闻资讯,而依赖电脑看新闻的用户不到一成。近八成用户会在社交平台分享新闻。中国移动媒体未来五个趋向新闻客户端的社交深化;UGC和内容众包模式升级;入口向平台转化加速;可穿戴设备带来数据资源扩张;移动服务客户端的“媒体化”可能。PPT全文如下:摘自:腾讯科技
加入like.tg生态圈,即可获利、结识全球供应商、拥抱全球软件生态圈加入like.tg生态圈,即可获利、结识全球供应商、拥抱全球软件生态圈加入like.tg生态圈,即可获利、结识全球供应商、拥抱全球软件生态圈