android WebView将新浪天气为我所用 ------>仅供娱乐(一个android webview 执行js的简单框架)

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

新浪天气提供了一个网页     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 根据城市获取天气天气预报) 因为项目中需要用天气预报功能,所以 阅读详情

相关推荐

Android获取网页信息,天气

背景:通过天气接口获取天气具体内容并显示在Android手机上。这是网页显示的,我们的目的就是要先拿到这个全部内容。在后面加上所要查询的城市就可以了(国内)

桃子不出的博客 2425

Android实现天气预报功能

Android实现天气预报功能。超级简单。实现百度地图接口就OK.

安卓实现天气预报(通过webView直接显示和OKhttp请求数据显示两种方式)

博客参考https://blog.csdn.net/hongfei568718926/article/details/109117723

Android使用WebView来显示天气预报

利用webview实现的天气预报的简单获取,大家还可以对其稍加修改弄的更加华丽一点~~

kyrin(云中鹤) 1万+

android WebView新浪天气为我所用 ------>仅供娱乐

新浪天气提供了一个网页 http://w.sina.com 浏览器访问: 这效果还可以了哦,直接用webview加载出来,效果也可以了哦,不过,这不是我要的。我不希望在我写的应用里到处铺满sina的logo,我喜欢的效果是这样的: 这样干净利索,多好。 如果你也喜欢,那下面就一起来改造它吧: 首先创建android项目: 先写layout: activity_weathe...

haierboos 231

AndroidWebView的交互细节天气可视化Demo实战

Android使用WebView交互 Android使用webView细节 文章目录Android使用WebView交互前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 android中使用WebView细节繁多,特此记录一个天气可视化折线图,android端使用WebView 提示:以下是本篇文章正文内容,下面案例可供参考 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码如

Android_Cob的博客 2470

Android制作天气预报软件 —— 天气查询

代码中实现的是AsyncTask中的onPreExecute()、doInBackground()两个函数,此外,还定义了openConnection()函数。天气情况的显示除了文字方式,设计中还添加了图片方式。该项使用的是极速数据的天气预报接口,利用接口获取指定地区当天信息(设计中显示的是日期、当前温度、最高温、最低温、城市名、星期、风向、天气、更新时间)以及未来四天天气相关情况(设计中显示的是日期、最高温、最低温、天气),之后将获取信息传递给界面进行显示,不同的天气界面会通过变化图标进行表示。

weixin_58963766的博客 2480

android 新浪天气,android WebView新浪天气为我所用 ------>仅供娱乐

新浪天气提供了一个网页 http://w.sina.com浏览器访问:这效果还可以了哦,直接用webview加载出来,效果也可以了哦,不过,这不是我要的。我不希望在我写的应用里到处铺满sina的logo,我喜欢的效果是这样的:这样干净利索,多好。如果你也喜欢,那下面就一起来改造它吧:首先创建android项目:先写layout:activity_weather_sina.xmlandroi...

weixin_30780735的博客 187

Android开发】网络编程及Internet应用-获取天气预报

在Eclipse中创建Android项目,利用之前学过的WebView控件和中国天气网提供的天气数据接口,实现获取指定城市的天气预报。 布局文件: res/layout/main.xml:<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http:/...

weixin_34404393的博客 368

android开发【四】简单实现天气预报

xml: &lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:gravity="center_horizo

viafcccy的博客 1万+

android从网页获取天气

在EditText里输入城市名称,按按键即可获取天气,显示hello word的可根据网页内容自行加入 主要是将网页 "http://sixweather.3gpk.net/SixWeather.aspx?city=%s" String url = String.format(BASE_URL, URLEncoder.encode(mCity, "u

qq_26410361的博客 560

Android开发之天气预报(二)获取网络上的天气数据

获取网络上的天气数据 有一个天气预报发布网站 天气预报系统最重要的是获得有效、准确的天气信息,要想获取实时的天气信息,需要访问专门提供天气信息的网站把网站返回的信息解析出想要的信息并显示在手机上。使用中华万年历得到的接口(JSON): http://wthrcdn.etouch.cn/weather_mini?city=北京 (城市名称) 可以直接通过城市名字获得天气数据,json数据,实现起...

pumpkinstay的博客 9842

在你的网页中插入天气预报

根据需要,下面4个随便选一个 .moreWeatherIframe{ width:262px; height:195px; overflow:hidden; }

gundumw100的专栏 1368

获取天气

下面是一些可用的接口 1.https://www.tianqiapi.com/api/?version=v6&&city=杭州 2.http://api.help.bj.cn/apis/weather36h/?id=杭州 http://api.help.bj.cn/api/ 3.http://api.k780.com:88/?app=weather.history&we...

ZZH的博客 1365

获取天气预报数据小记

朋友计划做一个天气预报的app,作为一名计算机类专业的一名小白菜,我也想去划划水。 做软件比较重要的就是数据来源 我在谷歌上搜索了“如何获取天气数据” 信息来源真是看的人眼花缭乱,知乎,csdn,一些博客,掘金等等都提供了很多的方法 如何在繁杂的信息中迅速找到自己想要的信息? 1.在一个site上集中寻找:这个网站要符合内容专业性强,使用人数多,有良好的反馈机制这些特性。而且同一个网站便于信息的整...

weixin_44468538的博客 2067

android代码混淆 GSON完满解决

头疼的问题,json使用了google的gson三方包,可是混淆的时候出了问题 明明已经按照gson的官方文档,把混淆脚本加上去了,却还是出问题。 今天同事找到一篇博客,关于这个问题的: 我们是将json解析以后放到javabean中去的,但是一直出问题,放进去的字符串是对的,解析出来的javabean却是空,节操碎一地 -keep class com.google.**{

桃花源 1万+
上一篇: android ant 最简单的打包签名,混淆方法
下一篇: android 你或许不知道的屏幕适配
五柳--先生
博客等级 码龄16年 106粉丝 87原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值