android WebView将新浪天气为我所用 ------>仅供娱乐
新浪天气提供了一个网页 http://w.sina.com
浏览器访问:
这效果还可以了哦,直接用webview加载出来,效果也可以了哦,不过,这不是我要的。我不希望在我写的应用里到处铺满sina的logo,我喜欢的效果是这样的:
这样干净利索,多好。
如果你也喜欢,那下面就一起来改造它吧:
首先创建android项目:
先写layout:
activity_weather_sina.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/rl_weatherpage"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
- <WebView
- android:id="@+id/wv_oauth"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" />
- </LinearLayout>
不介绍啦,就放了一个WEBVIEW
接下来就写activity了:SinaPage.java
- package your.package;
- import android.app.Activity;
- import android.app.ProgressDialog;
- import android.content.Context;
- import android.content.DialogInterface;
- import android.content.DialogInterface.OnCancelListener;
- import android.graphics.Bitmap;
- import android.net.ConnectivityManager;
- import android.net.NetworkInfo;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Message;
- import android.util.Log;
- import android.view.KeyEvent;
- import android.view.View;
- import android.webkit.WebView;
- import android.webkit.WebViewClient;
- import android.widget.Toast;
- public class SinaPage extends Activity {
- private WebView webView;
- //url之所以写成这样而没有用final直接写死是有原因的。当某个端口被禁用后 貌似是8084,
- //执行js脚本的时候就会没有效果,所以我最后拿这个URL来做了下判断,看是否禁用了端口(正常情况完全不用考虑的)
- private static String URL = "http://w.sina.cn";
- private ProgressDialog dialog; //在加载的时候,我们最好给显示一个进度对话框,不然页面显得太呆板了
- private boolean isshow=false; //用来控制对话框的
- private Runnable runCallback; //这是一个回调,详细看下面的注释
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_weather_sina);
- /***
- * 这个是js脚本,下个文件我们再详细介绍
- */
- 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()})()";
- webView = (WebView) this.findViewById(R.id.wv_oauth);
- webView.setVisibility(View.INVISIBLE);
- if (getNetworkIsAvailable(SinaPage.this)) {
- if(!isFinishing()){
- handler.sendEmptyMessage(1);
- isshow = true;
- webView.getSettings().setJavaScriptEnabled(true);
- webView.addJavascriptInterface(this, "js2java");
- webView.setHorizontalScrollBarEnabled(false);
- webView.setHorizontalScrollbarOverlay(false);
- webView.setWebViewClient(new WebViewClient() {
- @Override
- public void onPageStarted(WebView view, String url,
- Bitmap favicon) {
- webView.setVisibility(View.INVISIBLE);
- handler.postDelayed( runCallback = new Runnable() {
- public void run() {
- System.out.println("当前加载进度------->"+SinaPage.this.webView.getProgress());
- /**
- * 超时后,首先判断页面加载进度,超时并且进度小于100,就执行超时后的动作
- *
- * 这里是超时的处理 放在一个runnable接口中做的
- */
- if (SinaPage.this.webView.getProgress() < 100) {
- Log.d("testTimeout", "timeout...........");
- Message msg = new Message();
- msg.what = 100;
- handler.sendMessage(msg);
- }
- }
- }, 15000);
- }
- public boolean shouldOverrideUrlLoading(WebView view, String url)
- {
- // 重写此方法表明点击网页里面的链接还是在当前的webview里跳转,
- // 不跳到浏览器那边
- // 如果不重写这个方法,那么webView将会打开手机中的浏览器
- webView.setVisibility(View.INVISIBLE);
- if(getNetworkIsAvailable(SinaPage.this))
- view.loadUrl(url);
- else{
- //网络不可用的时候发送异常
- Toast.makeText(getApplicationContext(), "网络错误", 0).show();
- handler.sendEmptyMessage(101);
- }
- if(!isshow){
- handler.sendEmptyMessage(1);
- isshow = true;
- }
- return true;
- }
- @Override
- public void onPageFinished(WebView view, String url) {
- webView.setVisibility(View.INVISIBLE);
- try{
- // //网页加载完成后,加载js脚本
- System.out.println("-------->url = "+url);
- URL = url;//这里涉及新浪他们服务器重定向,如果某些端口禁用了,那么重定向的url就不会生效
- //这里是执行我们上面的js脚本 最最重要的一步
- view.loadUrl(strScript);
- }catch(Throwable t){
- //这里是加载脚本可能出现的异常,我们暂时不作处理
- }
- }
- @Override
- public void onReceivedError(WebView view, int errorCode,
- String description, String failingUrl) {
- Toast.makeText(getApplicationContext(), "网络错误", 0).show();
- }
- });
- webView.loadUrl(URL);
- }
- }else{
- Toast.makeText(getApplicationContext(), "网络不可用,请打开网络后重试", 0).show();
- }
- }
- Handler handler = new Handler(){
- public void handleMessage(android.os.Message msg) {
- switch (msg.what) {
- case 0:
- /***
- * 修改在 8084端口被禁用的情况下,获取城市失败后重定向的问题
- *
- * 处理方法:手动添加重定向(直接搜索上海的天气情况)
- */
- if(URL.equals("http://w.sina.cn/")){
- //重定向失败了 URL没有被赋值,我们就去加载上海的天气,上海天气的url为下面的这个url
- //http://weather1.sina.cn/dpool/weather_new/forecast_new.php?city=%E4%B8%8A%E6%B5%B7&vt=4
- webView.loadUrl("http://weather1.sina.cn/dpool/weather_new/forecast_new.php?city=%E4%B8%8A%E6%B5%B7&vt=4");
- System.out.println("手动重定向");
- }else{
- //添加标识
- System.out.println("显示页面");
- webView.setVisibility(View.VISIBLE);
- if(dialog!=null && dialog.isShowing()&&!SinaPage.this.isFinishing()){
- dialog.dismiss();
- isshow = false;
- }
- }
- break;
- case 1:
- /***
- * 收到这个消息,就显示对话框
- */
- if(!SinaPage.this.isFinishing()&&getNetworkIsAvailable(SinaPage.this)){
- dialog = ProgressDialog.show(SinaPage.this, null, "正在为您加载...", true);
- dialog.setCanceledOnTouchOutside(false);
- dialog.setCancelable(true);
- dialog.setOnCancelListener(new OnCancelListener() {
- public void onCancel(DialogInterface dialog) {
- if(webView.canGoBack()){
- webView.goBack();
- }
- }
- });
- }
- break;
- case 100:
- /***
- * 收到这个消息,就提示网络不好 多数情况是超时了 ,超时 在runable里面处理的
- */
- Toast.makeText(getApplicationContext(), "网络状态不佳", 0).show();
- webView.setVisibility(View.INVISIBLE);
- webView.stopLoading();
- if(dialog!=null && dialog.isShowing()){
- dialog.dismiss();
- isshow = false;
- }
- break;
- case 101:
- if(dialog!=null && dialog.isShowing()&&!SinaPage.this.isFinishing()){
- dialog.dismiss();
- isshow = false;
- webView.stopLoading();
- }
- break;
- default:
- break;
- }
- };
- };
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- if (keyCode == KeyEvent.KEYCODE_BACK) {
- if(dialog!=null && dialog.isShowing()){
- dialog.dismiss();
- return true;
- }
- if(webView.canGoBack()){
- webView.goBack();
- return false;
- }
- }
- return super.onKeyDown(keyCode, event);
- }
- /***
- * 这个方法是提供给js脚本去回调的,
- * js脚本执行完,就会调这个方法,通知界面显示webview控件
- */
- public void javascriptFinished() {
- handler.sendEmptyMessage(0);
- handler.removeCallbacks(runCallback);
- }
- @Override
- protected void onDestroy() {
- //退出的时候要注意我们的对话框可能会引起程序挂掉,需要处理哦
- if(dialog!=null && dialog.isShowing()){
- dialog.dismiss();
- isshow = false;
- handler.removeCallbacks(runCallback);
- }
- super.onDestroy();
- }
- /**
- * 检查网络是否可用
- * @return true 为网络可用
- */
- public boolean getNetworkIsAvailable(Context context) {
- ConnectivityManager manager = (ConnectivityManager) context
- .getSystemService(context.CONNECTIVITY_SERVICE);
- NetworkInfo info = manager.getActiveNetworkInfo();
- if (info == null || !info.isConnected()) {
- return false;
- }
- if (info.isRoaming()) {
- return true;
- }
- return true;
- }
- }
为了节省空间,我把该写的都作为注释写上去了哦,到这就大功告成了?还没有哦,清单文件的权限一定要记得配置:
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="your.package"
- android:versionCode="1"
- android:versionName="1.0" >
- <uses-sdk android:minSdkVersion="7" />
- <uses-permission android:name="android.permission.INTERNET"/>
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
- <application
- android:icon="@drawable/ic_launcher"
- android:label="@string/app_name" >
- <activity
- android:label="@string/app_name"
- android:name=".SinaPage" >
- <intent-filter >
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </application>
- </manifest>
到这就大功告成了哦
赶紧试一下吧
最后补充一个javascript脚本相关内容
我们使用到的js脚本
- 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将新浪天气为我所用 ------>仅供娱乐的更多相关文章
- linux - 使用curl实现新浪天气API应用
新浪天气API的使用方法: API地址:http://php.weather.sina.com.cn/xml.php?city=%B1%B1%BE%A9&password=DJOYnieT82 ...
- scrapy新浪天气
一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到桌面上的程序: LX终端(LXTermin ...
- 根据新浪天气API获取各地天气状况(Java实现)
原文出自 参考网址(重要) http://blog.csdn.net/cyxlzzs/article/details/7602469 新浪 http://blog.csdn.net/l_ch_g/a ...
- 新浪天气api
package com.smartdot.dcu; /** * java获取新浪天气预报代码 */ import java.io.FileNotFoundException; import java. ...
- js获取新浪天气接口
<!doctype html> <html class="no-js fixed-layout"> <head> <meta charse ...
- android dialog 模拟新浪、腾讯title弹框效果
http://blog.csdn.net/jj120522/article/details/7764183 首先我们看一下新浪微博的效果(其它就是一个dialog): 点 ...
- 【多端应用开发系列1.1.1 —— Android:使用新浪API V2】服务器Json数据处理——Json数据概述
[前白] 一些基础的东西本系列中就不再详述了,争取尽量写些必不可少的技术要点. 由于本系列把Web Service 构建放到了第二部分,Android项目就采用新浪微博API v2作为服务器端. [原 ...
- 获取新浪天气api显示天气情况(转)
直接上一个html的demo <!doctype html> <html class="no-js fixed-layout"> <head> ...
- xpath爬取新浪天气
参考资料: http://cuiqingcai.com/1052.html http://cuiqingcai.com/2621.html http://www.cnblogs.com/jixin/p ...
随机推荐
- SPRING STS Virgo OSGI 开发一 : bundle 项目的创建
1. Spring STS 下载地址 (spring 最近改了站点 暂时不是太熟悉) http://spring.io/tools/sts/all 2. 下载 Virgo 插件 htt ...
- bzoj3632
裸的最大团,随机化大法好 多次随机出一个选择顺序然后贪心即可 ..,..] of boolean; a:..] of longint; v:..] of boolean; n,m,i,j,x,y,an ...
- bzoj1132
每次都选最左边的点,然后以这个点为原点 统计和这个点构成的三角形面积和 不难想到极角排序然后由叉积很容易求出 shl ; eps=1e-8; var i,j,k,m,n:longint; x,y:.. ...
- erl0004 - ets 安全遍历
safe_fixtable(Tab, true|false) -> true Types: Tab = tid() | atom() 锁定set,bag和 ...
- 持有对象:总结JAVA中的常用容器和迭代器,随机数 速查
JAVA使用术语“Collection”来指代那些表示集合的对象,JAVA提供的接口很多,首先我们先来记住他们的层次结构: java集合框架的基本接口/类层次结构 java.util.Collecti ...
- UVA 10098 Generating Fast, Sorted Permutation
// 给你字符串 按字典序输出所有排列// 要是每个字母都不同 可以直接dfs ^_^// 用前面说的生成排列算法 也可以直接 stl next_permutation #include <io ...
- Ios 程序封装,安装流程
转:http://www.myexception.cn/operating-system/1436560.html Ios 程序打包,安装流程 一.发布测试,是指将你的程序给 * 你的测试人员,因 ...
- Ajax+PHP简单入门教程
Ajax 由 HTML.JavaScript™ 技术.DHTML 和 DOM 组成,这一杰出的方法可以将笨拙的 Web 界面转化成交互性的 Ajax 应用程序.对于Ajax,最核心的一个对象是XMLH ...
- .Net刷新页面的小结
现在给大家讲讲在.Net中书信页面的几种方式: 第一: private void Button1_Click( object sender, System.EventArgs e ) { Respon ...
- 【转】匹配dll(exe)和pdb方法
1. 静态检查windbg 调试工具包中有一个工具symchk.exe, 选项很多, 下面一个简单的用法可以检查一个 test.exe能不能找到与它匹配的PDB: 这是成功的情形. 下面来个失败的作为 ...