新浪天气提供了一个网页     http://w.sina.com

浏览器访问:

这效果还可以了哦,直接用webview加载出来,效果也可以了哦,不过,这不是我要的。我不希望在我写的应用里到处铺满sina的logo,我喜欢的效果是这样的:

这样干净利索,多好。

如果你也喜欢,那下面就一起来改造它吧:

首先创建android项目:

先写layout:

activity_weather_sina.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:id="@+id/rl_weatherpage"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:orientation="vertical">
  7.  
  8. <WebView
  9. android:id="@+id/wv_oauth"
  10. android:layout_width="fill_parent"
  11. android:layout_height="fill_parent" />
  12. </LinearLayout>

不介绍啦,就放了一个WEBVIEW

接下来就写activity了:SinaPage.java

  1. package your.package;
  2.  
  3. import android.app.Activity;
  4. import android.app.ProgressDialog;
  5. import android.content.Context;
  6. import android.content.DialogInterface;
  7. import android.content.DialogInterface.OnCancelListener;
  8. import android.graphics.Bitmap;
  9. import android.net.ConnectivityManager;
  10. import android.net.NetworkInfo;
  11. import android.os.Bundle;
  12. import android.os.Handler;
  13. import android.os.Message;
  14. import android.util.Log;
  15. import android.view.KeyEvent;
  16. import android.view.View;
  17. import android.webkit.WebView;
  18. import android.webkit.WebViewClient;
  19. import android.widget.Toast;
  20.  
  21. public class SinaPage extends Activity {
  22. private WebView webView;
  23. //url之所以写成这样而没有用final直接写死是有原因的。当某个端口被禁用后 貌似是8084,
  24. //执行js脚本的时候就会没有效果,所以我最后拿这个URL来做了下判断,看是否禁用了端口(正常情况完全不用考虑的)
  25. private static String URL = "http://w.sina.cn";
  26. private ProgressDialog dialog; //在加载的时候,我们最好给显示一个进度对话框,不然页面显得太呆板了
  27. private boolean isshow=false; //用来控制对话框的
  28. private Runnable runCallback; //这是一个回调,详细看下面的注释
  29.  
  30. @Override
  31. protected void onCreate(Bundle savedInstanceState) {
  32. super.onCreate(savedInstanceState);
  33. setContentView(R.layout.activity_weather_sina);
  34.  
  35. /***
  36. * 这个是js脚本,下个文件我们再详细介绍
  37. */
  38. final String strScript = "javascript:(function(){var sum=1;var _el = document.getElementsByTagName('div');for (var i=0; i<_el.length; i++ ) {if (_el[i].className=='footer'||_el[i].className=='nav2'||_el[i].className=='bar3'||_el[i].className=='n2'||_el[i].className=='n1'||_el[i].className=='ss') {_el[i].style.display='none';} else if (_el[i].className=='barw') {sum++;}if(sum>2){_el[i].style.display='none'}};var array = document.getElementsByTagName('a');for(var i=0;i<array.length;i++) {var em = array[i];if(em.innerText=='\u67E5\u770B\u672A\u6765\u5929\u6C14\u8BE6\u60C5'||em.innerText=='\u751F\u6D3B\u6307\u6570') {em.style.display='none';}if(em.innerText=='\u56FD\u9645'||em.innerText=='\u65B0\u6D6A\u5929\u6C14') {em.parentElement.style.display='none';}}window.js2java.javascriptFinished()})()";
  39.  
  40. webView = (WebView) this.findViewById(R.id.wv_oauth);
  41. webView.setVisibility(View.INVISIBLE);
  42. if (getNetworkIsAvailable(SinaPage.this)) {
  43. if(!isFinishing()){
  44. handler.sendEmptyMessage(1);
  45. isshow = true;
  46. webView.getSettings().setJavaScriptEnabled(true);
  47. webView.addJavascriptInterface(this, "js2java");
  48. webView.setHorizontalScrollBarEnabled(false);
  49. webView.setHorizontalScrollbarOverlay(false);
  50. webView.setWebViewClient(new WebViewClient() {
  51. @Override
  52. public void onPageStarted(WebView view, String url,
  53. Bitmap favicon) {
  54. webView.setVisibility(View.INVISIBLE);
  55. handler.postDelayed( runCallback = new Runnable() {
  56. public void run() {
  57. System.out.println("当前加载进度------->"+SinaPage.this.webView.getProgress());
  58. /**
  59. * 超时后,首先判断页面加载进度,超时并且进度小于100,就执行超时后的动作
  60. *
  61. * 这里是超时的处理 放在一个runnable接口中做的
  62. */
  63. if (SinaPage.this.webView.getProgress() < 100) {
  64. Log.d("testTimeout", "timeout...........");
  65. Message msg = new Message();
  66. msg.what = 100;
  67. handler.sendMessage(msg);
  68. }
  69. }
  70. }, 15000);
  71.  
  72. }
  73.  
  74. public boolean shouldOverrideUrlLoading(WebView view, String url)
  75. {
  76. // 重写此方法表明点击网页里面的链接还是在当前的webview里跳转,
  77. // 不跳到浏览器那边
  78. // 如果不重写这个方法,那么webView将会打开手机中的浏览器
  79. webView.setVisibility(View.INVISIBLE);
  80. if(getNetworkIsAvailable(SinaPage.this))
  81. view.loadUrl(url);
  82. else{
  83. //网络不可用的时候发送异常
  84. Toast.makeText(getApplicationContext(), "网络错误", 0).show();
  85. handler.sendEmptyMessage(101);
  86. }
  87. if(!isshow){
  88. handler.sendEmptyMessage(1);
  89. isshow = true;
  90. }
  91. return true;
  92. }
  93.  
  94. @Override
  95. public void onPageFinished(WebView view, String url) {
  96. webView.setVisibility(View.INVISIBLE);
  97. try{
  98. // //网页加载完成后,加载js脚本
  99. System.out.println("-------->url = "+url);
  100. URL = url;//这里涉及新浪他们服务器重定向,如果某些端口禁用了,那么重定向的url就不会生效
  101.  
  102. //这里是执行我们上面的js脚本 最最重要的一步
  103. view.loadUrl(strScript);
  104. }catch(Throwable t){
  105. //这里是加载脚本可能出现的异常,我们暂时不作处理
  106. }
  107. }
  108.  
  109. @Override
  110. public void onReceivedError(WebView view, int errorCode,
  111. String description, String failingUrl) {
  112. Toast.makeText(getApplicationContext(), "网络错误", 0).show();
  113. }
  114. });
  115. webView.loadUrl(URL);
  116. }
  117.  
  118. }else{
  119. Toast.makeText(getApplicationContext(), "网络不可用,请打开网络后重试", 0).show();
  120. }
  121. }
  122.  
  123. Handler handler = new Handler(){
  124. public void handleMessage(android.os.Message msg) {
  125. switch (msg.what) {
  126. case 0:
  127. /***
  128. * 修改在 8084端口被禁用的情况下,获取城市失败后重定向的问题
  129. *
  130. * 处理方法:手动添加重定向(直接搜索上海的天气情况)
  131. */
  132. if(URL.equals("http://w.sina.cn/")){
  133. //重定向失败了 URL没有被赋值,我们就去加载上海的天气,上海天气的url为下面的这个url
  134. //http://weather1.sina.cn/dpool/weather_new/forecast_new.php?city=%E4%B8%8A%E6%B5%B7&vt=4
  135. webView.loadUrl("http://weather1.sina.cn/dpool/weather_new/forecast_new.php?city=%E4%B8%8A%E6%B5%B7&vt=4");
  136. System.out.println("手动重定向");
  137. }else{
  138. //添加标识
  139. System.out.println("显示页面");
  140. webView.setVisibility(View.VISIBLE);
  141. if(dialog!=null && dialog.isShowing()&&!SinaPage.this.isFinishing()){
  142. dialog.dismiss();
  143. isshow = false;
  144. }
  145. }
  146. break;
  147.  
  148. case 1:
  149. /***
  150. * 收到这个消息,就显示对话框
  151. */
  152. if(!SinaPage.this.isFinishing()&&getNetworkIsAvailable(SinaPage.this)){
  153. dialog = ProgressDialog.show(SinaPage.this, null, "正在为您加载...", true);
  154. dialog.setCanceledOnTouchOutside(false);
  155. dialog.setCancelable(true);
  156. dialog.setOnCancelListener(new OnCancelListener() {
  157.  
  158. public void onCancel(DialogInterface dialog) {
  159. if(webView.canGoBack()){
  160. webView.goBack();
  161. }
  162. }
  163. });
  164. }
  165. break;
  166.  
  167. case 100:
  168. /***
  169. * 收到这个消息,就提示网络不好 多数情况是超时了 ,超时 在runable里面处理的
  170. */
  171. Toast.makeText(getApplicationContext(), "网络状态不佳", 0).show();
  172. webView.setVisibility(View.INVISIBLE);
  173. webView.stopLoading();
  174. if(dialog!=null && dialog.isShowing()){
  175. dialog.dismiss();
  176. isshow = false;
  177. }
  178. break;
  179.  
  180. case 101:
  181. if(dialog!=null && dialog.isShowing()&&!SinaPage.this.isFinishing()){
  182. dialog.dismiss();
  183. isshow = false;
  184. webView.stopLoading();
  185. }
  186. break;
  187. default:
  188. break;
  189. }
  190. };
  191. };
  192.  
  193. public boolean onKeyDown(int keyCode, KeyEvent event) {
  194. if (keyCode == KeyEvent.KEYCODE_BACK) {
  195. if(dialog!=null && dialog.isShowing()){
  196. dialog.dismiss();
  197. return true;
  198. }
  199.  
  200. if(webView.canGoBack()){
  201. webView.goBack();
  202. return false;
  203. }
  204. }
  205. return super.onKeyDown(keyCode, event);
  206. }
  207.  
  208. /***
  209. * 这个方法是提供给js脚本去回调的,
  210. * js脚本执行完,就会调这个方法,通知界面显示webview控件
  211. */
  212. public void javascriptFinished() {
  213. handler.sendEmptyMessage(0);
  214. handler.removeCallbacks(runCallback);
  215. }
  216.  
  217. @Override
  218. protected void onDestroy() {
  219. //退出的时候要注意我们的对话框可能会引起程序挂掉,需要处理哦
  220. if(dialog!=null && dialog.isShowing()){
  221. dialog.dismiss();
  222. isshow = false;
  223. handler.removeCallbacks(runCallback);
  224. }
  225. super.onDestroy();
  226. }
  227.  
  228. /**
  229. * 检查网络是否可用
  230. * @return true 为网络可用
  231. */
  232. public boolean getNetworkIsAvailable(Context context) {
  233. ConnectivityManager manager = (ConnectivityManager) context
  234. .getSystemService(context.CONNECTIVITY_SERVICE);
  235. NetworkInfo info = manager.getActiveNetworkInfo();
  236. if (info == null || !info.isConnected()) {
  237. return false;
  238. }
  239. if (info.isRoaming()) {
  240. return true;
  241. }
  242. return true;
  243. }
  244. }

为了节省空间,我把该写的都作为注释写上去了哦,到这就大功告成了?还没有哦,清单文件的权限一定要记得配置:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="your.package"
  4. android:versionCode="1"
  5. android:versionName="1.0" >
  6.  
  7. <uses-sdk android:minSdkVersion="7" />
  8. <uses-permission android:name="android.permission.INTERNET"/>
  9. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
  10.  
  11. <application
  12. android:icon="@drawable/ic_launcher"
  13. android:label="@string/app_name" >
  14. <activity
  15. android:label="@string/app_name"
  16. android:name=".SinaPage" >
  17. <intent-filter >
  18. <action android:name="android.intent.action.MAIN" />
  19.  
  20. <category android:name="android.intent.category.LAUNCHER" />
  21. </intent-filter>
  22. </activity>
  23. </application>
  24.  
  25. </manifest>

到这就大功告成了哦

赶紧试一下吧

最后补充一个javascript脚本相关内容

我们使用到的js脚本

  1. javascript:(function(){var sum=1;var _el = document.getElementsByTagName('div');for (var i=0; i<_el.length; i++ ) {if (_el[i].className=='footer'||_el[i].className=='nav2'||_el[i].className=='bar3'||_el[i].className=='n2'||_el[i].className=='n1'||_el[i].className=='ss') {_el[i].style.display='none';} else if (_el[i].className=='barw') {sum++;}if(sum>2){_el[i].style.display='none'}};var array = document.getElementsByTagName('a');for(var i=0;i<array.length;i++) {var em = array[i];if(em.innerText=='\u67E5\u770B\u672A\u6765\u5929\u6C14\u8BE6\u60C5'||em.innerText=='\u751F\u6D3B\u6307\u6570') {em.style.display='none';}if(em.innerText=='\u56FD\u9645'||em.innerText=='\u65B0\u6D6A\u5929\u6C14') {em.parentElement.style.display='none';}}window.js2java.javascriptFinished()})()

就是用来隐藏那些个不需要的节点的,js我就不出来献丑了

android WebView将新浪天气为我所用 ------>仅供娱乐的更多相关文章

  1. linux - 使用curl实现新浪天气API应用

    新浪天气API的使用方法: API地址:http://php.weather.sina.com.cn/xml.php?city=%B1%B1%BE%A9&password=DJOYnieT82 ...

  2. scrapy新浪天气

    一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到桌面上的程序: LX终端(LXTermin ...

  3. 根据新浪天气API获取各地天气状况(Java实现)

    原文出自 参考网址(重要) http://blog.csdn.net/cyxlzzs/article/details/7602469  新浪 http://blog.csdn.net/l_ch_g/a ...

  4. 新浪天气api

    package com.smartdot.dcu; /** * java获取新浪天气预报代码 */ import java.io.FileNotFoundException; import java. ...

  5. js获取新浪天气接口

    <!doctype html> <html class="no-js fixed-layout"> <head> <meta charse ...

  6. android dialog 模拟新浪、腾讯title弹框效果

    http://blog.csdn.net/jj120522/article/details/7764183 首先我们看一下新浪微博的效果(其它就是一个dialog):                点 ...

  7. 【多端应用开发系列1.1.1 —— Android:使用新浪API V2】服务器Json数据处理——Json数据概述

    [前白] 一些基础的东西本系列中就不再详述了,争取尽量写些必不可少的技术要点. 由于本系列把Web Service 构建放到了第二部分,Android项目就采用新浪微博API v2作为服务器端. [原 ...

  8. 获取新浪天气api显示天气情况(转)

    直接上一个html的demo <!doctype html> <html class="no-js fixed-layout"> <head> ...

  9. xpath爬取新浪天气

    参考资料: http://cuiqingcai.com/1052.html http://cuiqingcai.com/2621.html http://www.cnblogs.com/jixin/p ...

随机推荐

  1. Android自动化测试之Monkeyrunner从零开始(三)

    转自http://www.51testing.com/html/81/22381-854342.html 时光过得太快了,一晃离上一篇monkeyrunner系列的博客已经一年多了.这一年多时间经历了 ...

  2. 二维树状数组(水题) POJ1195

    前段时间遇到线段树过不了,树状数组却过了的题.(其实线段树过得了的) 回忆了下树状数组. 主要原理,还是二进制位数,每一项的和表示其为它的前((最后一位1及其后)的二进制数)和,可从二进制图来看.(用 ...

  3. HTML空格符号 &nbsp / &ensp / &emsp

      半角的不断行的空白格(推荐使用)    半角的空格    全角的空格

  4. Java [leetcode 7] Reverse Integer

    问题描述: Reverse digits of an integer. Example1: x = 123, return 321 Example2: x = -123, return -321 Ha ...

  5. 省常中模拟 Test2 Day2

    two 模拟 大意:给你一个 N 位二进制数,有四种操作:加1.减1.乘2.整除2.给定一个操作序列,求最终结果.N <= 5*10^6.数据保证不会在最高位上进行进位或退位操作. 初步解法:由 ...

  6. Squid 反向代理加速网站

    本实例的域名是 wenjin.cache.ibm.com.cn,通过DNS的轮询 技术,将客户端的请求分发给其中一台 Squid 反向代理服务器处理,如果这台 Squid 缓存了用户的请求资源,则将请 ...

  7. [Everyday Mathematics]20150110

    试证: $$\bex \vlm{n}\frac{\ln^2n}{n}\sum_{k=2}^{n-2}\frac{1}{\ln k\cdot \ln(n-k)}=1. \eex$$

  8. [Everyday Mathematics]20150106

    (1). 设 $f\in C[0,T]$, $g$ 是 $T$-周期函数, 试证: $$\bex \vlm{n}\int_0^T f(x)g(nx)\rd x=\frac{1}{T}\int_0^T ...

  9. MyBatis的association示例——MyBatis学习笔记之三

    前两篇博文介绍的都是单表映射,而实际上很多时候我们需要用到较复杂的映射.今天学会的association的用法,就是一例,现写出来和大家分享(为简洁起见,ant工程中各文件.目录的布局,以及其它与前面 ...

  10. ThinkAndroid是简洁,快速的进行Android应用程序的框架

    ThinkAndroid简介ThinkAndroid是一个免费的开源的.简易的.遵循Apache2开源协议发布的Android开发框架,其开发宗旨是简单.快速的进行Android应用程序的开发,包含A ...