日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

[Android] AlertDialog获取网上天气并显示各城市天气

發布時間:2024/5/28 Android 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Android] AlertDialog获取网上天气并显示各城市天气 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? 最近幫同學做android百度地圖,其中涉及到定位城市天氣功能.才知道自己技術非常的一般,還有很多東西需要學習,同時需要回歸到我研究生的方向——數據挖掘.同時又見識到了一位叫柳峰的大神,推薦大家去看看他的文章,好像他還是貴州的老鄉.博文地址:http://blog.csdn.net/lyq8479/
? ? 言歸正傳,我主要通過兩種方法實現:
? ? 1.第一種方法是通過調用中國天氣網信息實現的,它的思想是通過查詢靜態數據庫中個城市對應的WeatherCode,在通過訪問中國天氣網獲取JSON格式數據顯示,天氣對應的圖片也從網上獲取.
? ? 2.第二種方法是通過新浪天氣API接口實現的,它只需要輸入查詢的具體城市或縣城即可獲取JSON格式天氣,而且天氣對應圖片采用res中靜態的對應.

? ? 參考資料:
? ? 中國天氣網網上資料較多,主要參考郭神《Android第一行代碼》

? ? http://smart.weather.com.cn/wzfw/smart/weatherapi.shtml
? ??http://blog.csdn.net/eyu8874521/article/details/11574485
? ??http://blog.csdn.net/lzqwebsoft/article/details/7054045
? ? http://blog.csdn.net/pi9nc/article/details/9297085?
?

一. 中國天氣網獲取天氣信息介紹

? ? 中國天氣網提供了獲取天氣及各個城市的代號信息.通過下面兩種接口方法獲取北京天氣,而獲取詳細信息的接口可能已更改.
? ? 1.簡單信息
?http://www.weather.com.cn/data/cityinfo/101010100.html

{"weatherinfo":{"city":"北京","cityid":"101010100","temp1":"-4℃","temp2":"5℃","weather":"陰轉晴","img1":"n2.gif","img2":"d0.gif","ptime":"18:00"}}

? ? 2.簡單信息?http://www.weather.com.cn/data/sk/101010100.html

{"weatherinfo":{"city":"北京","cityid":"101010100","temp":"1","WD":"東南風","WS":"2級","SD":"58%","WSE":"2","time":"18:15","isRadar":"1","Radar":"JC_RADAR_AZ9010_JB","njd":"暫無實況","qy":"1024"}}

? ? 程序主要通過該URL獲取城市的天氣,其中101010100表示的就是北京的天氣代號,它是如何獲取的呢?同樣中國天氣網提供了網址獲取不同城市/縣城的天氣代號.
? ??http://www.weather.com.cn/data/list3/city.xml
? ? 服務器會返回省份名稱+省級代號(一級列表,包括省/直轄市/自治區).如下:

01|北京,02|上海,03|天津,04|重慶,05|黑龍江,06|吉林,07|遼寧,08|內蒙古,09|河北,10|山西,11|陜西,12|山東,13|新疆,14|西藏,15|青海,16|甘肅,17|寧夏,18|河南,19|江蘇,20|湖北,21|浙江,22|安徽,23|福建,24|江西,25|湖南,26|貴州,27|四川,28|廣東,29|云南,30|廣西,31|海南,32|香港,33|澳門,34|臺灣

? ?在輸入省級代號獲取二級碼,如北京city01,貴州city26
? ??http://www.weather.com.cn/data/list3/city26.xml

2601|貴陽,2602|遵義,2603|安順,2604|黔南,2605|黔東南,2606|銅仁,2607|畢節,2608|六盤水,2609|黔西南

? ? 此時你如果你對地理熟悉,你可以發現它們分別是每個省的地區,同樣道理可以獲取每個地區的縣份或區的編碼.如輸入city2605
? ??http://www.weather.com.cn/data/list3/city2605.xml

260501|凱里,260502|岑鞏,260503|施秉,260504|鎮遠,260505|黃平,260506|從江,260507|麻江,260508|丹寨,260509|三穗,260510|臺江,260511|劍河,260512|雷山,260513|黎平,260514|天柱,260515|錦屏,260516|榕江

? ? 通過這種方法就可以把全國所有省、市、縣地區的天氣都實時獲取.如下是凱里市對應的天氣代號
? ??http://www.weather.com.cn/data/list3/city260501.xml

260501|101260501

? ? 到了此處,想必你也知道如果獲取凱里市的天氣了吧.就是輸入網址
? ??http://www.weather.com.cn/data/cityinfo/101260501.html

? ? ?由于在使用google瀏覽器獲取城市代號時總是報錯"This page contains the following errors",你只需要使用IE查看源碼就可獲取成功.但是我沒有通過網上動態獲取城市代號,方法知道即可.
? ? 其中天氣圖標可通過網站查看,而獲取具體圖標網址忘記記錄了.

? ??http://www.weather.com.cn/static/html/legend.shtml

二. 源碼顯示城市天氣

? ?這里就看著郭神的書實現吧,那個界面挺好看的.同時我自定義的AlertDialog對話框也挺好看的.
? ? 1.布局文件 activity_main.xml
<?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" ><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="50dp"android:background="#484E61" ><Buttonandroid:id="@+id/close_weather"android:layout_width="30dp"android:layout_height="30dp"android:layout_centerVertical="true"android:layout_marginLeft="10dp"android:background="@drawable/home" /><TextViewandroid:id="@+id/city_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:textColor="#fff"android:textSize="24sp" /><Buttonandroid:id="@+id/refresh_weather"android:layout_width="30dp"android:layout_height="30dp"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:layout_marginRight="10dp"android:background="@drawable/refresh" /></RelativeLayout><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:background="#27A5F9" ><TextViewandroid:id="@+id/publish_text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_marginRight="10dp"android:layout_marginTop="10dp"android:textColor="#FFF"android:textSize="18sp" /><LinearLayoutandroid:id="@+id/weather_info_layout"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:orientation="vertical" ><TextViewandroid:id="@+id/current_date"android:layout_width="wrap_content"android:layout_height="40dp"android:gravity="center"android:textColor="#FFF"android:textSize="18sp" /><TextViewandroid:id="@+id/weather_desp"android:layout_width="wrap_content"android:layout_height="60dp"android:layout_gravity="center_horizontal"android:gravity="center"android:textColor="#FFF"android:textSize="40sp" /><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="60dp"android:layout_gravity="center_horizontal"android:orientation="horizontal" ><TextViewandroid:id="@+id/temp1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:textColor="#FFF"android:textSize="40sp" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:layout_marginLeft="10dp"android:layout_marginRight="10dp"android:text="~"android:textColor="#FFF"android:textSize="40sp" /><TextViewandroid:id="@+id/temp2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:textColor="#FFF"android:textSize="40sp" /></LinearLayout></LinearLayout></RelativeLayout></LinearLayout> ? ?2.在res/drawable-hdpi文件夾中添加兩張按鈕圖片home.png和refresh.png
? ?3.MainActivity.java

? public class MainActivity extends Activity implements OnClickListener {//自定義變量private TextView cityNameText; //用于顯示城市名private TextView publishText; //用于顯示發布時間private TextView weatherDespText; //用于顯示天氣描述信息private TextView temp1Text; //用于顯示最低氣溫private TextView temp2Text; //用于顯示最高氣溫private TextView currentDateText; //用于顯示當前日期private Button closeWeather; //退出程序private Button refreshWeather; //更新天氣按鈕private String weatherCode; //天氣代碼private String weatherJson; //獲取JSON格式@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_main);//獲取對象cityNameText = (TextView) findViewById(R.id.city_name);publishText = (TextView) findViewById(R.id.publish_text);weatherDespText = (TextView) findViewById(R.id.weather_desp);temp1Text = (TextView) findViewById(R.id.temp1);temp2Text = (TextView) findViewById(R.id.temp2);currentDateText = (TextView) findViewById(R.id.current_date);closeWeather = (Button) findViewById(R.id.close_weather);refreshWeather = (Button) findViewById(R.id.refresh_weather);//主活動 implements OnClickListenercloseWeather.setOnClickListener(this);refreshWeather.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.close_weather:finish();break;case R.id.refresh_weather:DialogChooseCity();break;default:break;}}/*** 自定義對話框 獲取城市* 中國天氣網 * http://www.weather.com.cn/data/cityinfo/101010100.html*/private void DialogChooseCity() {//創建對話框AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);builder.setTitle("請選擇一個城市");builder.setIcon(android.R.drawable.ic_dialog_info);//指定下拉列表的顯示數據final String[] cities = {"北京", "上海", "天津", "廣州", "貴陽", "臺北", "香港"};final String[] codes = {"101010100", "101020100", "101030100","101280101","101260101", "101340101", "101320101"};builder.setItems(cities, new DialogInterface.OnClickListener(){@Overridepublic void onClick(DialogInterface dialog, int which){weatherCode = codes[which];//執行線程訪問http//否則 NetworkOnMainThreadExceptionnew Thread(new Runnable() {@Overridepublic void run() {//訪問中國天氣網String weatherUrl = "http://www.weather.com.cn/data/cityinfo/"+ weatherCode + ".html";weatherJson = queryStringForGet(weatherUrl);//JSON格式解析try {JSONObject jsonObject = new JSONObject(weatherJson);JSONObject weatherObject = jsonObject.getJSONObject("weatherinfo");Message message = new Message();message.obj = weatherObject;handler.sendMessage(message);} catch (JSONException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}).start();}});builder.show();}/*** 解析Json格式數據并顯示*/@SuppressLint("HandlerLeak")Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubsuper.handleMessage(msg);JSONObject object = (JSONObject) msg.obj;try {cityNameText.setText(object.getString("city"));temp1Text.setText(object.getString("temp1"));temp2Text.setText(object.getString("temp2"));weatherDespText.setText(object.getString("weather"));publishText.setText("今天"+object.getString("ptime")+"發布");//獲取當前日期SimpleDateFormat sdf = new SimpleDateFormat("yyyy年M月d日", Locale.CHINA);currentDateText.setText(sdf.format(new Date()));} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}};/*** 網絡查詢*/private String queryStringForGet(String url) {HttpGet request = new HttpGet(url);String result = null;try {HttpResponse response = new DefaultHttpClient().execute(request);if (response.getStatusLine().getStatusCode() == 200) {result = EntityUtils.toString(response.getEntity(), HTTP.UTF_8);return result;}} catch (ClientProtocolException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ParseException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return result;}} ? ? 4.最后在AndroidManifest.xml中聲明網絡權限 <!-- 申請權限 --> <uses-permission android:name="android.permission.INTERNET" />

? ?5.運行效果如下圖所示

? ?????
? ?6.需要注意幾點
? ? (1)在訪問http或獲取上傳網絡數據時,你可能會遇到錯誤導致程序崩潰,即錯誤NetworkOnMainThreadException.你需要自定義線程實現,通過:

new Thread(new Runnable() {@Overridepublic void run() {//具體操作....}}).start(); ? ?(2)當從網上獲取JSON格式數據后,你需要學會JSONObject將數據解析出來.同時如果可能與數據庫進行操作,存入db數據庫中.
? ? (3)如果可能通過自定義DBHelper(繼承自SQLiteOpenHelper)和DBManager獲取靜態數據庫中數據,查看對應城市或縣份的天氣代碼.但是重新移植數據庫總是報錯"no such table:city_table".但是明明存在,可能是數據庫路徑"/data/data/包名/databases/mydata.db"定義或引用錯誤,仍未解決.
? ? 通過SQLiteSpy軟件打開db文件,很明顯存在city_table表和數據.如下圖所示:

? ? ?(4)學會自定義AlertDialog并調用它,同時獲取網絡圖片那個URL當時查看到沒記錄,可惜了.
? ? PS:最后推薦看看郭神《Android第一行代碼》第十四章關于天氣的講解,但基本原理和方法該文章我都已經講述了.

?

三. 新浪天氣API實現

? ? 新浪天氣API方法同上,但唯一不同點是輸入城市名稱.這樣就不需要再次獲取WeatherCode,訪問網址如下:
? ??http://php.weather.sina.com.cn/iframe/index/w_cl.php?code=js&day=2&city=北京&dfc=3
? ? 如獲取北京的新浪天氣,返回的JSON格式如下:

(function(){var w=[];w['北京']=[{s1:'霾',s2:'陰',f1:'mai',f2:'yin',t1:'5',t2:'-4',p1:'≤3',p2:'3-4',d1:'無持續風向',d2:'北風'},{s1:'晴',s2:'晴',f1:'qing',f2:'qing',t1:'5',t2:'-5',p1:'4-5',p2:'4-5',d1:'北風',d2:'北風'},{s1:'晴',s2:'晴',f1:'qing',f2:'qing',t1:'2',t2:'-5',p1:'3-4',p2:'3-4',d1:'北風',d2:'北風'}];var add={now:'2014-12-18 20:55:04',time:'1418907304',update:'北京時間12月18日17:05更新',error:'0',total:'1'};window.SWther={w:w,add:add};})();//0

? ? 程序中顯示效果如下圖所示,顯示的時候是參考了huanghsh的模板,但是不知道它源地址.所以見諒!否則推薦大家去下載看看~

? ??

? ?其中原理與上面相同,通過調用HttpService.getWeather(cityName)函數獲取天氣.其中自定義類HttpService代碼中getWeather如下,而DefaultHttpClient是自定義設置代理. public static String getWeather(String city){ String result=null;String url="http://php.weather.sina.com.cn/iframe/index/w_cl.php?code=js&day=2&city="+city+"&dfc=3";try{ DefaultHttpClient client = getDefaultHttpClient2(); HttpGet mothod = new HttpGet(url); HttpResponse httpResponse = client.execute(mothod);if (httpResponse.getStatusLine().getStatusCode() == 200) { result = EntityUtils.toString(httpResponse.getEntity(),"gb2312"); } }catch(Exception ex){ ex.printStackTrace(); } return result; } ? ?而天氣圖片是通過res/drawable文件夾下靜態圖片顯示,該方法也介紹下! private int imageResoId(String weather){int resoid=R.drawable.s_2;if(weather.indexOf("多云")!=-1||weather.indexOf("晴")!=-1){//多云轉晴,以下類同 indexOf:包含字串resoid=R.drawable.s_1;}else if(weather.indexOf("多云")!=-1&&weather.indexOf("陰")!=-1){resoid=R.drawable.s_2;}else if(weather.indexOf("陰")!=-1&&weather.indexOf("雨")!=-1){resoid=R.drawable.s_3;}else if(weather.indexOf("晴")!=-1&&weather.indexOf("雨")!=-1){resoid=R.drawable.s_12;}else if(weather.indexOf("晴")!=-1&&weather.indexOf("霧")!=-1){resoid=R.drawable.s_12;}else if(weather.indexOf("晴")!=-1){resoid=R.drawable.s_13;}else if(weather.indexOf("多云")!=-1){resoid=R.drawable.s_2;}else if(weather.indexOf("陣雨")!=-1){resoid=R.drawable.s_3;}else if(weather.indexOf("小雨")!=-1){resoid=R.drawable.s_3;}else if(weather.indexOf("中雨")!=-1){resoid=R.drawable.s_4;}else if(weather.indexOf("大雨")!=-1){resoid=R.drawable.s_5;}else if(weather.indexOf("暴雨")!=-1){resoid=R.drawable.s_5;}else if(weather.indexOf("冰雹")!=-1){resoid=R.drawable.s_6;}else if(weather.indexOf("雷陣雨")!=-1){resoid=R.drawable.s_7;}else if(weather.indexOf("小雪")!=-1){resoid=R.drawable.s_8;}else if(weather.indexOf("中雪")!=-1){resoid=R.drawable.s_9;}else if(weather.indexOf("大雪")!=-1){resoid=R.drawable.s_10;}else if(weather.indexOf("暴雪")!=-1){resoid=R.drawable.s_10;}else if(weather.indexOf("揚沙")!=-1){resoid=R.drawable.s_11;}else if(weather.indexOf("沙塵")!=-1){resoid=R.drawable.s_11;}else if(weather.indexOf("霧")!=-1){resoid=R.drawable.s_12;}return resoid; } ? ?其中自定義對話框輸入AlertDialog,載入weather_other_city.xml布局僅有一個輸入框ExitText控件.通過Intent傳參至顯示天氣的界面.具體代碼如下.
? //輸入城市名 private void showOtherCity() {LayoutInflater inflater = getLayoutInflater();View layout = inflater.inflate(R.layout.weather_other_city,(ViewGroup) findViewById(R.id.ws_dialog));dialogCity = (EditText)layout.findViewById(R.id.ws_city_name);//創建對話框new AlertDialog.Builder(this).setTitle("請輸入城市名稱").setView(layout).setPositiveButton("確定",new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int id) {cityName = dialogCity.getText().toString();Intent intent = new Intent(MainActivity.this, WeatherScreen.class);intent.putExtra("extra_data", cityName);startActivity(intent);}}).setNegativeButton("取消", new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int id) {dialog.cancel();}}).show(); } ? ?由于新浪方法類似,所以就簡述了些其他如顯示靜態圖片和AlertDialog的知識.
? ?最后簡單總結下吧!第一種方法主要通過中國天氣網顯示信息,其核心是獲取天氣代碼WeatherCode,然后訪問URL獲取JSON格式數據并顯示.第二種方法僅僅是傳入城市名稱(不要傳錯),然后獲取JSON數據顯示天氣即可.最后希望文章對大家有所幫助,如果有錯誤或不足之處,還請海涵~

? ?(By:Eastmount 2014-12-18 晚9點?http://blog.csdn.net/eastmount/)

?

總結

以上是生活随笔為你收集整理的[Android] AlertDialog获取网上天气并显示各城市天气的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲色欲色欲www在线观看 | 欧美性爱视频久久 | 国产美女福利在线 | 亚洲天堂区 | 久久婷婷婷 | 国产精品成人免费精品自在线观看 | 成人在线观看视频网站 | 三上悠亚ed2k | 国产精品久久久久久久久久久新郎 | 美女视屏 | 国产精品久久免费视频 | 波多野吉衣毛片 | 撸撸在线视频 | 欧美亚洲日本国产 | 亚洲国产片 | 麻豆av导航 | 丰满少妇熟乱xxxxx视频 | www.夜夜 | 涩涩涩涩涩涩涩涩涩 | 能在线观看的av网站 | 青青草91| 久久久av一区二区三区 | 欧美日韩国产亚洲一区 | 免费的毛片网站 | 91看片就是不一样 | 国产原创中文av | 国模无码大尺度一区二区三区 | 日韩69视频 | 小箩莉末发育娇小性色xxxx | 91精产国品| 在线观看 中文字幕 | 变态另类丨国产精品 | 在线观看日本 | 狠狠干天天 | 欧美成人国产精品一区二区 | 色女仆影院 | 国产91黄色 | 黑丝一区二区三区 | 大又大粗又爽又黄少妇毛片 | 91久久久国产精品 | 欧美日韩中文字幕一区 | 欧美一级二级片 | 四虎网站最新网址 | 国产精品性 | 在线中文字幕网站 | 日韩中文字幕第一页 | 久久久久久久久久影院 | 快射视频网站 | 国产大片aaa| 自拍偷拍国产 | 天堂视频免费 | 一级少妇片 | 特级a级片| 男女在楼梯上高潮做啪啪 | 免费观看一区二区 | 亚洲视频免费 | 性饥渴的农村熟妇 | 嫩草伊人久久精品少妇av | 国语对白少妇spa私密按摩 | 日本一区二区欧美 | 99热r| 成年人视频网 | 动漫精品一区一码二码三码四码 | 中日韩精品视频在线观看 | 国产精伦 | 老妇裸体性猛交视频 | 国产区一区二区三 | 国产精品蜜臀av | 黄色美女片 | 成人av入口 | 成人免费在线视频 | 亚洲激情欧美色图 | 亚洲黄色成人 | 五月香蕉网 | 2020亚洲男人天堂 | 日本三级456 | www.欧美视频| 欧美性开放视频 | h网站免费在线观看 | 日韩一级片视频 | 国产色播 | 欧美一区亚洲 | 中日韩黄色大片 | 欧美老熟| 无人在线观看高清视频 | 小视频在线看 | 久久中文字幕一区二区 | 国模吧一区二区三区 | av在线观| 成人午夜电影网站 | av免费高清| 在线观看av毛片 | 黄色性视频网站 | 久久性感视频 | 欧美日韩黄色一区二区 | 亚洲国产黄色 | 影音先锋成人资源站 | 人妻av无码一区二区三区 | 操操网|