首页 文章 精选 留言 我的

精选列表

搜索[搭建],共10000篇文章
优秀的个人博客,低调大师

Hadoop 2.x环境搭建准备

一:下载Hadoop image.png 二:安装说明 http://hadoop.apache.org/docs/r2.5.2/hadoop-project-dist/hadoop-common/SingleCluster.html 三:查看是否安装jdk 四:强力卸载已将安装的JDK 空格分开卸载项。利用--nodeps参数强力卸载 image.png 5:上传文件Hadoop和jdk image.png :6:解压jdk文件到指定目录 tar -zxvf jdk-7u67-linux-x64.tar.gz -C /opt/modules/ 7:设置jdk环境变量 vi /etc/profile 末尾添加java环境变量 image.png 8:环境变量生效 source /etc/profile image.png 9:解压hadoop tar -zxvf hadoop-2.5.0.tar.gz -C /opt/modules/ image.png 10:修改hadoop环境文件 vi /opt/modules/hadoop-2.5.0/etc/hadoop/hadoop-env.sh image.png 修改java环境变量 image.png 11、hadoop三种启动模式 本地模式 未分布式模式 分布式模式 12、本地模式Local (Standalone) Mode 说明:part-r-00000 表示是MapReduce跑出来的结果。 以dfs开始a-z不限的结果只有一个。 样例 统计下面文本中各单词出现的次数 命令说明:jar 命令运行MapReduce样例 传入参数统计 wcinput目录下所有文件各单词出现的次数,并把结果输出到wcoutput目录下 查看执行结果 image.png 13、配置core-site.xml 设置HDFS地址 <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://192.168.57.192:8020</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/opt/modules/hadoop-2.5.0/data/tmp</value> </property> </configuration> 14、配置hdfs-site.xml 文件分布式存储备份个数 <configuration> <property> <name>dfs.replication</name> <value>1</value> </property> </configuration> 15、格式化HDFS的NAMENODE bin/hdfs namenode -format 16启动HDFS的主节点NameNode 启动命令:sbin/hadoop-daemon.sh start namenode 说明:hadoop-daemon.sh 是hadoop的守护进程,利用它启动HDFS的主节点。 image.png 17、启动HDFS的从节点DataNode sbin/hadoop-daemon.sh start datanode 18、查看是否启动成功 jps 19、开通8020/50070端口 vi /etc/sysconfig/iptables 20、访问HDFS的web页面 image.png 21、进入HDFS文件系统 image.png 22、创建HDFS文件目录 创建HDFS文件系统目录bin/hdfs dfs -mkdir -p /user/beifeng/mapreduce/wordcount/input 23、上传wc.input 文本文件 上传wc.input命令:bin/hdfs dfs -put wcinput/wc.input /user/beifeng/mapreduce/wordcount/input 把wc.input 文件上传到/user/beifeng/mapreduce/wordcount/input目录下 image.png 24、报错:datanode 错误。解决方法 25、上传文件成功并查看 上传用命令:-put image.png 26、通过HDFS服务器系统统计单词数量 命令:bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0.jar wordcount /user/beifeng/mapreduce/wordcount/input/ /user/beifeng/mapreduce/wordcount/output image.png 27、查看 命令bin/hdfs dfs -cat /user/beifeng/mapreduce/wordcount/output/part* image.png image.png

优秀的个人博客,低调大师

php 环境搭建(windows php+apache)

今天我们这个章节介绍安装php,但是实际上php环境实际上包括:php+mysql+apache或者php+mysql+Nginx,一个是windows系统下常用的环境,一个是Linux系统下的常用环境。今天着重介绍php+mysql+apache的安装介绍。 一、apache的安装介绍 下载地址:https://www.apachehaus.com/cgi-bin/download.plx 2.解压文件 二、下载mysql 下载地址:https://dev.mysql.com/downloads/mysql/ 三、下载PHP 下载地址:http://windows.php.net/download#php-5.6 四、在D:盘下新建文件夹website,同时在website目录下新建apache24,mysql,php三个文件 mysql目录把解压的文件拷贝加进去 五,启动apache 1.测试安装是否成功 在浏览器中,输入http://localhost,看到如下界面,就表示安装成功 提示it works安装成功! 六、什么是静态网站,什么是动态网站? 是否和数据库打交道,动态网站的内容是随时变化的,而静态则一成不变(除非更改源代码)。 对于动态网站而言,我们需要提供一个数据源,通常情况下,是由数据库来完成的。比如mysql 对于apache而言,他只能管理文件和文件夹,并不能完成和数据库的交互,也不能完成逻辑代码的编写,所以,我们需要一门语言来完成这个工作,这就是PHP了。 对于静态网站来说,只有html,css和javascript,而动态网站,则包括一门语言和数据库(PHP+MySQL) 七、安装php(我们已经把php下载的文件,解压到website/php/目录下了) 1.Php并没有独立的安装程序,它是作为apache的一个模块来安装的 2.要将php作为apache的一个模块来运行,将php配置为apache的一个模块,使用loadmodule指令完成。 LoadModule 模块名 模块文件php5apache2_4.dll(就是php目录下的这个文件) 3.找到website/apache24/conf/http.conf文件,搜索LoadMoule 在这些配置的最后一段添上 LoadModule php5_module "D:/website/php/php5apache2_4.dll" AddType application/x-httpd-php .php PHPIniDir "D:/website/php/" 4. PHP在运行的时候,需要载入php的配置文件,由于php是作为apache的一个模块来运行的,所以我们需要告知apache,这个配置在哪里。 找到php.ini相关文件,复制其中一个,然后更名为php.ini,使用PHPIniDir配置,设置PHP.Ini路径(PHPIniDir "D:/website/php/")看上图 5.在php.ini文件里开启扩展,在文件里搜索extension_dir,修改为:extension_dir = "D:/website/php/ext",并开启需要的扩展如下图 6,设置时区 注:一定要注意,在php.ini配置过程中,要顶格写。每一次配置都需要重启apache才能生,php.ini也是一样。php与apache之间的联系Php作为apache的一个模块来运行的,php和apache是通过CGI来关联的 文章来至:http://www.codexueyuan.com/learn/learn-detail30-phpmake

优秀的个人博客,低调大师

环境搭建时常用的Linux命令

1.rz: command not found rz命令没找到?执行sz,同样也没找到。 安装lrzsz: yum -y install lrzsz 2. lsb_release -a bash: lsb_release: command not found... 安装lsb_release: yum install -y redhat-lsb 3.查看系统版本:lsb_release -a 4.查看linux服务器的ip:ip addr 5.service iptables status 若提示为iptables:unrecognized service,则说明没有安装,需要安装。 Linux,CentOS使用此命令安装:yum install iptables 6.ifconfig命令不存在 :yum -y install net-tools 7.Centos7.0+查看防火墙的状态:firewall-cmd --state not running 【表示防火墙关闭状态】 running 【表示防火墙开启状态】 8.关闭防火墙 停止firewall:systemctl stop firewalld.service 禁止firewall开机启动:systemctl disable firewalld.service ------------------------------------------------------------------------------- 1.令查看CPU的概况信息 cat /proc/cpuinfo 2.查看物理CPU个数 cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l 3.查看逻辑CPU个数 cat /proc/cpuinfo |grep "processor"|wc -l 4.查看每个CPU中的核心数 cat /proc/cpuinfo| grep "cpu cores"| uniq 5.每个物理CPU中的逻辑CPU cat /proc/cpuinfo | grep "siblings" A - 总核数 = 物理CPU个数 X 每颗物理CPU的核数 B - 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 ------------------------------------------------------------------- 1.查找文件/文件夹命令 find / -name abc 2.目录A重命名为B mv A B 3.将/a目录移动到/b下,并重命名为c mv /a /b/c 4.安装文件 yum install xxx -------------------------------------------------------------------- 压缩和解压命令: 1.将当前目录下的所有文件和文件夹全部压缩成mantis.zip文件,-r表示递归压缩子目录下所有文件 zip -r mantis.zip ./* 2.把文件解压到当前目录下 unzip test.zip 3.把文件解压到指定的目录下,需要用到-d参数,不想覆盖已经存在的文件,那么可以加上-n参数 unzip -d /temp test.zip unzip -n -d /temp test.zip 4.tar.gz压缩 tar -zcvf 压缩文件名.tar.gz 被压缩文件名 5.tar.gz文件解压,解压缩后的文件放在当前的目录 tar -zxvf 压缩文件名.tar.gz --------------------------------------------------------------------------- JAVA环境配置 1.修改配置文件 vi /etc/profile export JAVA_HOME=/usr/local/jdk1.7.0_79 export JRE_HOME=/usr/java/jdk1.7.0_60/jre export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib export PATH=$PATH:$JAVA_HOME/bin 2.使配置文件生效 source /etc/profile 3.查看java版本 java –version -------------------------------------------------------------------- 1.关闭防火墙 service iptables stop 2.检查防火墙状态 service iptables status 3.启动ftp服务 service vsftpd start 4.检查ftp服务器状态 service vsftpd status 5.连接ftp服务器 ftp 172.16.11.247 21(#ftp服务器默认端口是21) 用户名: 密码: --------------------------------------------------------------------- 开启数据库的步骤: 1.切换用户:su - oracle 2.打开oracle监听:lsnrctl start 3.进入sqlplus:sqlplus /nolog 4.使用sysdba角色登录sqlplus:conn /as sysdba 5.启动数据库:startup 6.关闭数据库:shutdown 7.强制关闭数据库:shutdown abort ---------------------------------------------------------------------- 关闭服务器命令: shutdown -h now

优秀的个人博客,低调大师

android移动开发环境搭建与配置

1、下载android sdk http://developer.android.com/sdk/index.html 然后解压到指定目录即可,目录结构如下 2、进入eclipse目录,启动eclipse,先check of update下 依次window》sdk manager安装更新必要的插件 3、再到window》preferences里查看sdk是否有效,无效则会报错 5、创建一个android project,然后run config里配置下 6、点击window》android vdm》new一个新的出来,然后点击start,如下图 PS: 如果这个选项出不来,那么先执行如下的步骤: 6、当上一步完全启动后,右键工程名上,run as》 android app即可运行 7、配置环境变量PATH,在我自己的电脑上如下 F:\adt-bundle-windows-x86-20130219\sdk\platform-tools;F:\adt-bundle-windows-x86-20130219\sdk\tools; 这个是用于以后使用adb和emulator命令(http://developer.android.com/tools/help/adb.html) PS:安装包下载地址: http://pan.baidu.com/share/link?shareid=445649&uk=1495773032 本文转自 小强测试帮 51CTO博客,原文链接:http://blog.51cto.com/xqtesting/1147868,如需转载请自行联系原作者

优秀的个人博客,低调大师

搭建lvs+keepalived+mfs+nagios架构

[前言]看过很多与架构有关的文章,但大部分都是其架构中一部分的某部分,经过很长一段时间思考,想将其一部分的一部分的知识整合到一起形成一个“看似比较大点的部分”,也就有了我这篇文章。当然大家也可以说我这篇文章也是架构的一部分的某部分,但我觉得它还是值得大家参考学习的,最起码我是这样想的。 这篇文章可能会一直处与有待修整状态,因为它不是最完美的,会随着我的测试而更新,但直到我的这台测试机下线为止,可能将无法再提供更新! 本篇以四大部分组成,每一大部分还可能有若干个小块组成。 四大部分分别为: (I)前端部分 (1)lvs+keepalived (2)RealServer (3)测试 基本的功能测试 (II)数据存储 (1)主控服务器安装 (2)元数据日志服务器安装 (3)数据存储服务器安装 (4)客户端安装 (5)测试基本功能测试 (III)监控部分 (1)Nagios软件安装 (2)nagios报警方式测试(email,短信,msn) (3)nagios添加监控监控元素(IV)总测试 (1)LVS失败/切换 (2)LVS故障隔离 (3)LVS伸缩测试(简单来说就是增删真实服务器) (4)基与域名的虚拟主机测试 (5)让Backup调度器也工作 (6)负载调度器只有一台,我该如何用keepalived呢? (7)客户端挂载限制测试 (8)动态扩展添加服务器或者磁盘 (9)垃圾回收机制 (10)主控服务器恢复测试 (11)mfs高可用测试 声明:本篇文章所有的内容都是经测试后而写的,并且不是针对新手而写的。 测试平台:centos5.5+kvm虚拟机 拓扑图: 本文转自hahazhu0634 51CTO博客,原文链接:http://blog.51cto.com/5ydycm/437294,如需转载请自行联系原作者

优秀的个人博客,低调大师

centos6 - elk基础入门搭建

1 2 3 4 5 6 7 [root@host-192-168-53-108~] #rm-rf/etc/yum.repos.d/* [root@host-192-168-53-108~] #wget-O/etc/yum.repos.d/CentOS-Base.repohttp://mirrors.aliyun.com/repo/Centos-6.repo [root@host-192-168-53-108~] #yumcleanall [root@host-192-168-53-108~] #yum-yinstalljava-1.8.0-openjdk* [root@host-192-168-53-108~] #wgethttps://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.0.rpm [root@host-192-168-53-108~] #rpm-ivhelasticsearch-5.5.0.rpm [root@host-192-168-53-108~] #chkconfig--addelasticsearch 1 2 [root@host-192-168-53-108~] #cat/etc/hosts 192.168.53.108elk1 1 2 3 4 5 6 7 8 9 [root@host-192-168-53-108~] #cat/etc/elasticsearch/elasticsearch.yml node.name:elk1 network.host:192.168.53.108 http.port:9200 bootstrap.memory_lock: false bootstrap.system_call_filter: false discovery.zen. ping .unicast.hosts:[elk1] http.cors.enabled: true http.cors.allow-origin: "*" 1 2 3 4 [root@host-192-168-53-108~] #cat/etc/elasticsearch/jvm.options|grep-v'^#'|grep-v^$ #修改 -Xms6g -Xmx6g 1 2 3 4 5 [root@host-192-168-53-108~] #vim/etc/security/limits.conf *softnofile1000000 *hardnofile1000000 *softnproc1000000 *hardnproc1000000 1 2 3 [root@host-192-168-53-108~] #cat/etc/security/limits.d/90-nproc.conf *softnproc100000 rootsoftnprocunlimited 1 2 3 4 5 6 [root@host-192-168-53-108~] #cd/usr/local/ [root@host-192-168-53-108 local ] #gitclonegit://github.com/mobz/elasticsearch-head.git [root@host-192-168-53-108 local ] #wgethttps://nodejs.org/dist/v8.2.0/node-v8.2.0-linux-x64.tar.gz--no-check-certificate [root@host-192-168-53-108 local ] #tarzxfnode-v8.2.0-linux-x64.tar.gz [root@host-192-168-53-108 local ] #ln-s/usr/local/node-v8.2.0-linux-x64/bin/node/usr/sbin/node [root@host-192-168-53-108 local ] #ln-s/usr/local/node-v8.2.0-linux-x64/bin/npm/usr/sbin/npm 1 2 3 4 5 #设置npm代理镜像 [root@host-192-168-53-108 local ] #npmconfigsetregistryhttps://registry.npm.taobao.org [root@host-192-168-53-108 local ] #npminstall-ggrunt [root@host-192-168-53-108 local ] #ln-s/usr/local/node-v8.2.0-linux-x64/lib/node_modules/grunt/bin/grunt/usr/sbin/grunt [root@host-192-168-53-108 local ] #cdelasticsearch-head/ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [root@host-192-168-53-108elasticsearch- head ] #npminstall Errormakingrequest. Error:connectETIMEDOUT52.216.1.0:443 atObject.exports._errnoException(util.js:1024:11) atexports._exceptionWithHostPort(util.js:1047:20) atTCPConnectWrap.afterConnect[asoncomplete](net.js:1150:14) Pleasereportthisfulllogathttps: //github .com /Medium/phantomjs npmWARNelasticsearch- head @0.0.0licenseshouldbeavalidSPDXlicenseexpression npmWARNoptionalSKIPPINGOPTIONALDEPENDENCY:fsevents@1.1.2(node_modules /fsevents ): npmWARNnotsupSKIPPINGOPTIONALDEPENDENCY:Unsupportedplatform for fsevents@1.1.2:wanted{ "os" : "darwin" , "arch" : "any" }(current:{ "os" : "linux" , "arch" : "x64" }) npmERR!codeELIFECYCLE npmERR!errno1 npmERR!phantomjs-prebuilt@2.1.14 install :`node install .js` npmERR!Exitstatus1 npmERR! npmERR!Failedatthephantomjs-prebuilt@2.1.14 install script. npmERR!Thisisprobablynotaproblemwithnpm.Thereislikelyadditionalloggingoutputabove. npmERR!Acompletelogofthisruncanbefound in : npmERR! /root/ .npm /_logs/2017-07-26T11_29_47_063Z-debug .log 1 2 [root@host-192-168-53-108elasticsearch- head ] #npminstallphantomjs-prebuilt@2.1.14--ignore-scripts [root@host-192-168-53-108elasticsearch- head ] #npminstall 1 2 3 4 [root@host-192-168-53-108elasticsearch- head ] #vim/usr/local/elasticsearch-head/_site/app.js #把localhost改为ip this.base_uri=this.config.base_uri||this.prefs.get( "app-base_uri" )|| "http://localhost:9200" ; this.base_uri=this.config.base_uri||this.prefs.get( "app-base_uri" )|| "http://192.168.53.108:9200" ; 1 2 3 4 5 6 7 8 9 10 11 [root@host-192-168-53-108elasticsearch- head ] #vim/usr/local/elasticsearch-head/Gruntfile.js connect:{ server:{ options:{ hostname : "0.0.0.0" , #添加此行 port:9100, base: '.' , keepalive: true } } } 1 2 3 4 [root@host-192-168-53-108elasticsearch- head ] #gruntserver& [root@host-192-168-53-108elasticsearch- head ] #echo"cd/usr/local/elasticsearch-head;gruntserver&">>/etc/rc.local [root@host-192-168-53-108elasticsearch- head ] #cd [root@host-192-168-53-108~] #wgethttps://artifacts.elastic.co/downloads/logstash/logstash-5.5.0.rpm 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [root@host-192-168-53-108~] #vim/etc/logstash/conf.d/system.conf input{ file { path=> "/var/log/messages" type => "systemlog" start_position=> "beginning" stat_interval=> "2" } } output{ elasticsearch{ hosts=>[ "192.168.53.108:9200" ] index=> "logstash-systemlog-%{+YYYY.MM.dd}" } } 1 [root@host-192-168-53-108~] #/usr/share/logstash/bin/logstash-f/etc/logstash/conf.d/system.conf 1 2 #在Elasticsearch中查看 #浏览器访问http://192.168.53.108:9100/选择基本查询搜素 1 2 [root@host-192-168-53-108~] #wgethttps://artifacts.elastic.co/downloads/kibana/kibana-5.5.0-x86_64.rpm [root@host-192-168-53-108~] #rpm-ivhkibana-5.5.0-x86_64.rpm 1 2 3 4 [root@host-192-168-53-108~] #cat/etc/kibana/kibana.yml|grep-v'^#'|grep-v^$ server.port:5601 server.host: "0.0.0.0" elasticsearch.url: "http://elk1:9200" 1 2 [root@host-192-168-53-108~] #/etc/init.d/kibanastart [root@host-192-168-53-108~] #chkconfig--addkibana 本文转自谢无赖51CTO博客,原文链接:http://blog.51cto.com/xieping/1951765,如需转载请自行联系原作者

优秀的个人博客,低调大师

eclipse上Android NDK开发环境搭建

首先要有已集成好Android adt插件的eclipse,如果没有,到http://developer.android.com/sdk/index.html下载已集成ADT的eclipse。 下载Android NDK包http://developer.android.com/tools/sdk/ndk/index.html并解压。 打开eclipse,点击菜单栏 Windows ---> Preferences---> Android ---> NDK 找到上一步解压的NDK,点击OK 保存。 新建一个Android项目ndktest,并在工程下新建jni文件夹。 在编写native函数,例在com.example.ndktest下创建类 myjni。 运行cmd,定位到ndktest根目录下,运行命令javah -classpath bin\classes -d jni com.example.ndktest.myjni 会在jni文件下生成一个h头文件。 如果点开有报错,可以忽略它,可能因为找不到jni.h这个头文件,先不管。 在jni文件夹下编写com_example_ndktest_myjni.c文件实现方法getSum。 在jni文件夹下编写android.mk文件 在package Explorer 里,右键工程 ----> Properties 选择Program ---> OKOK 保存。 libmyjni.so 动态库已生成libs\armeabi文件夹下。 后面附上HTK中工具HCopy的Android 动态库工程的源码,下载导入工程后,确保已经安装好NDK,并修改第9步,第二图中的NDK_Builder的location到你的NDK包下的cmd即可。 上述例子工程源码:http://down.51cto.com/data/1499353 HCopy动态库工程源码:http://down.51cto.com/data/1499346 本文转自 ponpon_ 51CTO博客,原文链接:http://blog.51cto.com/liuxp0827/1438625,如需转载请自行联系原作者

优秀的个人博客,低调大师

android122 zhihuibeijing 主页面搭建

右边主页面布局设计: 文字颜色选择器和是否点击的图片选择器 路径和写法: <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/home_press" android:state_checked="true"/> 单选框勾选上后的红色图片 <item android:drawable="@drawable/home"/> 默认没有点上去时的白色图片 </selector> <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:color="@android:color/black"/> <item android:color="@android:color/white"/> </selector> 引用选择器: <RadioButton android:id="@+id/rb_home" style="@style/BottomTabStyle" android:drawableTop="@drawable/btn_tab_home_selector" "首页"文字上面的图片是一个图片选择器 android:text="首页" /> <style name="BottomTabStyle"> <item name="android:layout_width">wrap_content</item> <item name="android:layout_height">wrap_content</item> <item name="android:layout_gravity">center_vertical</item> <item name="android:button">@null</item> 没有button <item name="android:drawablePadding">3dp</item> <item name="android:padding">5dp</item> <item name="android:textColor">@drawable/btn_tab_text_selector</item> 颜色是一个颜色选择器 <item name="android:layout_weight">1</item> <item name="android:gravity">center</item> </style> 右边主页面fragment_content.xml <!-- 上下结构,没有叠加,所以用线性布局 --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <!-- 上面的详情的ViewPager --> <com.itheima.zhbj52.view.NoScrollViewPager android:id="@+id/vp_content" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> <RadioGroup android:id="@+id/rg_group" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/bottom_tab_bg" android:orientation="horizontal" > <!-- 水平排列 --> <!-- <style name="BottomTabStyle"> <item name="android:layout_width">wrap_content</item> <item name="android:layout_height">wrap_content</item> <item name="android:layout_gravity">center_vertical</item> <item name="android:button">@null</item> 没有button <item name="android:drawablePadding">3dp</item> <item name="android:padding">5dp</item> <item name="android:textColor">@drawable/btn_tab_text_selector</item> 颜色是一个颜色选择器 <item name="android:layout_weight">1</item> <item name="android:gravity">center</item> </style> --> <RadioButton android:id="@+id/rb_home" 有了id才能一次只能选择一个RadioButton style="@style/BottomTabStyle" android:drawableTop="@drawable/btn_tab_home_selector" "首页"文字上面的图片是一个图片选择器 android:text="首页" /> <RadioButton android:id="@+id/rb_news" style="@style/BottomTabStyle" android:drawableTop="@drawable/btn_tab_news_selector" 由于勾选和不勾选的图片不一样,所以每一个都要图片选择器。 android:text="新闻中心" /> <RadioButton android:id="@+id/rb_smart" style="@style/BottomTabStyle" android:drawableTop="@drawable/btn_tab_smart_selector" android:text="智慧服务" /> <RadioButton android:id="@+id/rb_gov" style="@style/BottomTabStyle" android:drawableTop="@drawable/btn_tab_gov_selector" android:text="政务" /> <RadioButton android:id="@+id/rb_setting" style="@style/BottomTabStyle" android:drawableTop="@drawable/btn_tab_setting_selector" android:text="设置" /> </RadioGroup> </LinearLayout> 清单文件: <!-- 使用xUtils时需要的权限 ,导入xUtils-2.6.14.jar,也可以通过导入xUtils的library的方式加进去--><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 右边主页面(除去5个RadioButton的页面布局,ViewPager): 上图的布局设计base_pager.xml (ViewPager里面的布局) <!-- 右边主页面(除去5个RadioButton的页面布局): --> <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <!-- 上面的红色新闻 --> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/title_red_bg" > <TextView android:id="@+id/tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="智慧北京" android:textColor="#fff" android:textSize="22sp" /> <ImageButton android:id="@+id/btn_menu" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="5dp" android:background="@null" android:src="@drawable/img_menu" /> <!-- 三条红色的横线 --> </RelativeLayout> <!-- 下面的空布局 --> <FrameLayout android:id="@+id/fl_content" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" > </FrameLayout> </LinearLayout> 上面base_pager.xml转换后的View对象所在的java类的基类BasePager: package com.itheima.zhbj52.base; import android.app.Activity; import android.view.View; import android.view.View.OnClickListener; import android.widget.FrameLayout; import android.widget.ImageButton; import android.widget.TextView; import com.itheima.zhbj52.MainActivity; import com.itheima.zhbj52.R; import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu; /** * 主页下5个子页面的基类 */ public class BasePager { public Activity mActivity; public View mRootView; public TextView tvTitle;// 标题对象 public FrameLayout flContent;// 下面的空布局 public ImageButton btnMenu;// 三条红色的横线 public BasePager(Activity activity) { mActivity = activity; initViews(); } /** * 初始化布局 */ public void initViews() { mRootView = View.inflate(mActivity, R.layout.base_pager, null); tvTitle = (TextView) mRootView.findViewById(R.id.tv_title);//TextView flContent = (FrameLayout) mRootView.findViewById(R.id.fl_content);//下面的空布局 btnMenu = (ImageButton) mRootView.findViewById(R.id.btn_menu);//三条红色的横线 btnMenu.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { toggleSlidingMenu(); } }); } /** * 切换SlidingMenu的状态(左边的侧边栏是否可以拉出来) */ protected void toggleSlidingMenu() { MainActivity mainUi = (MainActivity) mActivity; SlidingMenu slidingMenu = mainUi.getSlidingMenu();//getSlidingMenu()方法可以在MainActivity类中直接获取,所以这里在MainActivity对象中获取。 slidingMenu.toggle();// 切换状态, 显示时隐藏, 隐藏时显示 } /** * 初始化数据 */ public void initData() { } /** * 设置侧边栏开启或关闭 */ public void setSlidingMenuEnable(boolean enable) { MainActivity mainUi = (MainActivity) mActivity; SlidingMenu slidingMenu = mainUi.getSlidingMenu();//getSlidingMenu()方法可以在MainActivity类中直接获取,所以这里在MainActivity对象中获取。 if (enable) { slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN); } else { slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_NONE); } } } 自定义NoScrollViewPager.java控件 package com.itheima.zhbj52.view; import android.content.Context; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.view.MotionEvent; /** * 不能左右划的ViewPager */ public class NoScrollViewPager extends ViewPager { public NoScrollViewPager(Context context, AttributeSet attrs) { super(context, attrs); } public NoScrollViewPager(Context context) { super(context); } // 表示事件是否拦截, 返回false表示不拦截,继续传递给子标签 @Override public boolean onInterceptTouchEvent(MotionEvent arg0) { return false; } /** * 重写onTouchEvent事件,什么都不用做则不能滑动了。 */ @Override public boolean onTouchEvent(MotionEvent arg0) { return false; } } 右边主页面ContentFragment.java (包括ViewPager和RadioButton) package com.itheima.zhbj52.fragment; import java.util.ArrayList; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.view.View; import android.view.ViewGroup; import android.widget.RadioGroup; import android.widget.RadioGroup.OnCheckedChangeListener; import com.itheima.zhbj52.R; import com.itheima.zhbj52.base.BasePager; import com.itheima.zhbj52.base.impl.GovAffairsPager; import com.itheima.zhbj52.base.impl.HomePager; import com.itheima.zhbj52.base.impl.NewsCenterPager; import com.itheima.zhbj52.base.impl.SettingPager; import com.itheima.zhbj52.base.impl.SmartServicePager; import com.lidroid.xutils.ViewUtils; import com.lidroid.xutils.view.annotation.ViewInject; /** * 主页内容 */ public class ContentFragment extends BaseFragment { //将rgGroup和R.id.rg_group关联起来,等同于rgGroup = (RadioGroup) view.findViewById(R.id.rg_group); @ViewInject(R.id.rg_group) private RadioGroup rgGroup; @ViewInject(R.id.vp_content) private ViewPager mViewPager;//右边主页面(除去5个RadioButton的页面布局)采用ViewPager实现。 private ArrayList<BasePager> mPagerList; @Override public View initViews() { View view = View.inflate(mActivity, R.layout.fragment_content, null); // rgGroup = (RadioGroup) view.findViewById(R.id.rg_group); 得到RadioGroup,已经通过注解实现。 ViewUtils.inject(this, view); // Fragment使用xUtils时用这种方式注入view和事件,这样才能在Fragment里面使用注解@ViewInject。 return view; } @Override public void initData() { rgGroup.check(R.id.rb_home);// 默认勾选首页,则那个RadioButton被勾选,图片和颜色变成被勾选时的状态。 // 初始化5个子页面 mPagerList = new ArrayList<BasePager>(); //5个Pager共用同一个布局(分别下面5个RadionButton的"首页,新闻中心,智慧服务,政务,设置 页面"),只是数据不一样。 mPagerList.add(new HomePager(mActivity));//HomePager extends BasePager,mActivity是ContentFragment通过getActivity()获得的。 mPagerList.add(new NewsCenterPager(mActivity));//NewsCenterPager extends BasePager mPagerList.add(new SmartServicePager(mActivity));//SmartServicePager extends BasePager mPagerList.add(new GovAffairsPager(mActivity));//GovAffairsPager extends BasePager mPagerList.add(new SettingPager(mActivity));//SettingPager extends BasePager mViewPager.setAdapter(new ContentAdapter()); // 监听RadioGroup的选择事件 rgGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { switch (checkedId) { case R.id.rb_home: // mViewPager.setCurrentItem(0);// 设置当前页面 mViewPager.setCurrentItem(0, false);// 去掉切换页面的动画 break; case R.id.rb_news: mViewPager.setCurrentItem(1, false);// 设置当前页面 break; case R.id.rb_smart: mViewPager.setCurrentItem(2, false);// 设置当前页面 break; case R.id.rb_gov: mViewPager.setCurrentItem(3, false);// 设置当前页面 break; case R.id.rb_setting: mViewPager.setCurrentItem(4, false);// 设置当前页面 break; default: break; } } }); mViewPager.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int arg0) { mPagerList.get(arg0).initData();// 获取当前被选中的页面, 初始化该页面数据,防止预加载时候去加载耗时的数据。 } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageScrollStateChanged(int arg0) { } }); mPagerList.get(0).initData();// 手动初始化首页数据 } class ContentAdapter extends PagerAdapter { @Override public int getCount() { return mPagerList.size(); } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == arg1; } @Override public Object instantiateItem(ViewGroup container, int position) { BasePager pager = mPagerList.get(position); View view = pager.mRootView;//mRootView = View.inflate(mActivity, R.layout.base_pager, null); container.addView(view);//mRootView是BasePager的base_pager.xml布局。 // pager.initData();// 初始化数据.... ViewPager在加载第一页的时候会加载出第二页,在加载第二页的时候会缓存第三页的数据,ViewPager默认会缓存3页的数据。不要放在此处初始化数据, 否则会预加载下一个页面.也就是说预加载也是调用这个方法。 return view;//ViewPager里面用的就是base_pager.xml所对应的mRootView这个View对象,这个xml里面的数据已经被BasePager的子类填充了。 } /*对比: @Override public Object instantiateItem(ViewGroup container, int position) { View view = View.inflate(MainActivity.this, R.layout.adapter_ad, null); //填充View的数据,这里是直接加载一个独立的xml转换为View对象进行修改数据后返回出去,上面的实现是返回的是某个类的属性(这个属性是mRootView = View.inflate(mActivity, R.layout.base_pager, null),修改xml数据在这个类中修改这个属性即可),也就是说这里只要返回xml对象或者View对象都可以,在其他任何地方修改这个xml对象或者View对象的数据就可以实现显示数据了,上面修改数据是在BasePager的子类实现的。 ImageView imageView = (ImageView) view.findViewById(R.id.image); imageView.setImageResource(list.get(position%list.size()).getIconResId()); container.addView(view);//一定不能少,将view加入到viewPager中 return view; }*/ @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } } /** * 获取新闻中心页面 */ public NewsCenterPager getNewsCenterPager() { return (NewsCenterPager) mPagerList.get(1); } } 用来修改base_pager.xml的BasePager的子类之一HomePager.java,这几个Pager是下面5个RadioButton切换时的Pager package com.itheima.zhbj52.base.impl; import android.app.Activity; import android.graphics.Color; import android.view.Gravity; import android.view.View; import android.widget.TextView; import com.itheima.zhbj52.MainActivity; import com.itheima.zhbj52.base.BasePager; import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu; /** * 首页实现 */ public class HomePager extends BasePager { public HomePager(Activity activity) { super(activity); } @Override public void initData() { System.out.println("初始化首页数据...."); tvTitle.setText("智慧北京");// 修改标题 btnMenu.setVisibility(View.GONE);// 隐藏菜单按钮 setSlidingMenuEnable(false);//关闭侧边栏不可滑动出来。 TextView text = new TextView(mActivity); text.setText("首页"); text.setTextColor(Color.RED); text.setTextSize(25); text.setGravity(Gravity.CENTER); // 向FrameLayout空白布局中动态添加布局 flContent.addView(text); } } BaseFragment package com.itheima.zhbj52.fragment; import android.app.Activity; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; /** * fragment基类 * * @author Kevin * */ public abstract class BaseFragment extends Fragment { public Activity mActivity; // fragment创建 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mActivity = getActivity();//获取Fragment依附的Activity } // 处理fragment的布局 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return initViews(); } // 依附的activity创建完成 @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); initData(); } // 子类必须实现初始化布局的方法 public abstract View initViews(); // 初始化数据, 可以不实现 public void initData() { } } MainActivity package com.itheima.zhbj52; import android.os.Bundle; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.view.Window; import com.itheima.zhbj52.fragment.ContentFragment; import com.itheima.zhbj52.fragment.LeftMenuFragment; import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu; import com.jeremyfeinstein.slidingmenu.lib.app.SlidingFragmentActivity; /** * 主页面 */ public class MainActivity extends SlidingFragmentActivity { private static final String FRAGMENT_LEFT_MENU = "fragment_left_menu"; private static final String FRAGMENT_CONTENT = "fragment_content"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE);//所有的fragment也没有标题。 setContentView(R.layout.activity_main);//右边的主界面 setBehindContentView(R.layout.left_menu);// 设置左边的侧边栏 SlidingMenu slidingMenu = getSlidingMenu();// 获取侧边栏对象,MainActivity可以直接获取。 slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);// 设置全屏触摸 slidingMenu.setBehindOffset(200);// 设置预留屏幕的宽度 initFragment(); } /** * 初始化fragment, 将fragment数据填充给布局文件 */ private void initFragment() { FragmentManager fm = getSupportFragmentManager(); FragmentTransaction transaction = fm.beginTransaction();// 开启事务 transaction.replace(R.id.fl_left_menu, new LeftMenuFragment(), FRAGMENT_LEFT_MENU);// 用fragment替换framelayout transaction.replace(R.id.fl_content, new ContentFragment(), FRAGMENT_CONTENT); transaction.commit();// 提交事务 // Fragment leftMenuFragment = fm.findFragmentByTag(FRAGMENT_LEFT_MENU); } // 获取侧边栏fragment public LeftMenuFragment getLeftMenuFragment() { FragmentManager fm = getSupportFragmentManager(); LeftMenuFragment fragment = (LeftMenuFragment) fm .findFragmentByTag(FRAGMENT_LEFT_MENU); return fragment; } // 获取主页面fragment public ContentFragment getContentFragment() { FragmentManager fm = getSupportFragmentManager(); ContentFragment fragment = (ContentFragment) fm .findFragmentByTag(FRAGMENT_CONTENT); return fragment; } } 本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/5041253.html,如需转载请自行联系原作者

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Eclipse

Eclipse

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。

JDK

JDK

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。