Android Weather Forecast - Google Weather API - FULL SOURCE

Tutorials with advanced 'difficulty' and more Lines of Code.

Android Weather Forecast - Google Weather API - FULL SOURCE

Postby plusminus » Mon Dec 24, 2007 3:24 pm

Android Weather Forecast - Google Weather API
:arrow: Hop to the actual Tutorial-Part :larrow:
The Full Source

:rarrow: :rarrow: To download the whole project, scroll to the attachments in the end of this post. :larrow: :larrow:


:idea: Designed/Tested with sdk-version: m5-rc14

:arrow: Lets get it on :D :
:idea: The package-structure:
Image


:idea: "/AndroidManifest.xml"
Syntax: [ Download ] [ Hide ]
Using xml Syntax Highlighting
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3.    package="org.anddev.android.weatherforecast">
  4.     <application android:icon="@drawable/icon">
  5.         <activity android:name=".WeatherForecast" android:label="@string/app_name">
  6.             <intent-filter>
  7.                 <action android:name="android.intent.action.MAIN" />
  8.                 <category android:name="android.intent.category.LAUNCHER" />
  9.             </intent-filter>
  10.         </activity>
  11.     </application>
  12. </manifest>
Parsed in 0.002 seconds, using GeSHi 1.0.8.4


:idea: "/res/layout/main.xml"
Syntax: [ Download ] [ Hide ]
Using xml Syntax Highlighting
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.    android:orientation="vertical"
  4.    android:layout_width="fill_parent"
  5.    android:layout_height="fill_parent"
  6.    android:background="@drawable/weather_background"
  7.    >
  8.     <TableLayout
  9.         android:orientation="horizontal"
  10.         android:layout_width="fill_parent"
  11.         android:layout_height="wrap_content"
  12.         android:stretchColumns="0"
  13.         >
  14.         <TableRow
  15.                         android:layout_width="fill_parent"
  16.                         android:layout_height="wrap_content">
  17.                         <TextView  
  18.                         android:layout_width="wrap_content"
  19.                         android:layout_height="wrap_content"
  20.                         android:text="Usage like: 'City, Country'"
  21.                         android:gravity="left"
  22.                         />
  23.                 <CheckBox android:id="@+id/chk_usecelsius"  
  24.                         android:layout_width="wrap_content"
  25.                                 android:layout_height="wrap_content"
  26.                                 android:text="Use °C (not °F)"
  27.                                 android:gravity="right"
  28.                 />
  29.         </TableRow>
  30.     </TableLayout>
  31.     <TableLayout
  32.         android:orientation="horizontal"
  33.         android:layout_width="fill_parent"
  34.         android:layout_height="wrap_content"
  35.         android:stretchColumns="0"
  36.         >
  37.         <TableRow
  38.                         android:layout_width="fill_parent"
  39.                         android:layout_height="wrap_content">
  40.                          
  41.                         <EditText android:id="@+id/edit_input"
  42.                         android:layout_width="wrap_content"
  43.                         android:layout_height="wrap_content"
  44.                         android:text="Schriesheim, Germany"
  45.                         android:singleLine="true"
  46.                         />
  47.                 <Button android:id="@+id/cmd_submit"
  48.                         android:layout_width="wrap_content"
  49.                         android:layout_height="wrap_content"
  50.                         android:text="OK"
  51.                 />
  52.         </TableRow>
  53.     </TableLayout>
  54.                
  55.     <org.anddev.android.weatherforecast.views.SingleWeatherInfoView
  56.         android:id="@+id/weather_today"
  57.         android:orientation="horizontal"
  58.         android:layout_width="fill_parent"
  59.         android:layout_height="wrap_content"
  60.         android:gravity="center_horizontal"
  61.         android:paddingTop="15px"
  62.         />
  63.     <TableLayout
  64.         android:orientation="horizontal"
  65.         android:layout_width="fill_parent"
  66.         android:layout_height="wrap_content"
  67.         android:stretchColumns="0,1,2,3"
  68.         android:paddingTop="15px"
  69.         >
  70.                 <TableRow
  71.                                 android:layout_width="fill_parent"
  72.                                 android:layout_height="wrap_content">
  73.                         <org.anddev.android.weatherforecast.views.SingleWeatherInfoView
  74.                                 android:id="@+id/weather_1"
  75.                                 android:layout_width="wrap_content"
  76.                                 android:layout_height="wrap_content"
  77.                                 android:gravity="center_horizontal"
  78.                                 android:orientation="vertical"
  79.                                 />
  80.                         <org.anddev.android.weatherforecast.views.SingleWeatherInfoView
  81.                                 android:id="@+id/weather_2"
  82.                                 android:layout_width="wrap_content"
  83.                                 android:layout_height="wrap_content"
  84.                                 android:gravity="center_horizontal"
  85.                                 android:orientation="vertical"
  86.                                 />
  87.                         <org.anddev.android.weatherforecast.views.SingleWeatherInfoView
  88.                                 android:id="@+id/weather_3"
  89.                                 android:layout_width="wrap_content"
  90.                                 android:layout_height="wrap_content"
  91.                                 android:gravity="center_horizontal"
  92.                                 android:orientation="vertical"
  93.                                 />
  94.                         <org.anddev.android.weatherforecast.views.SingleWeatherInfoView
  95.                                 android:id="@+id/weather_4"
  96.                                 android:layout_width="wrap_content"
  97.                                 android:layout_height="wrap_content"
  98.                                 android:gravity="center_horizontal"
  99.                                 android:orientation="vertical"
  100.                                 />
  101.                         </TableRow>
  102.     </TableLayout>
  103. </LinearLayout>
Parsed in 0.012 seconds, using GeSHi 1.0.8.4


:idea: "/src/your_package_structure/WeatherForecast.java"
Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1. package org.anddev.android.weatherforecast;
  2.  
  3. import java.net.MalformedURLException;
  4. import java.net.URL;
  5.  
  6. import javax.xml.parsers.SAXParser;
  7. import javax.xml.parsers.SAXParserFactory;
  8.  
  9. import org.anddev.android.weatherforecast.views.SingleWeatherInfoView;
  10. import org.anddev.android.weatherforecast.weather.GoogleWeatherHandler;
  11. import org.anddev.android.weatherforecast.weather.WeatherCurrentCondition;
  12. import org.anddev.android.weatherforecast.weather.WeatherForecastCondition;
  13. import org.anddev.android.weatherforecast.weather.WeatherSet;
  14. import org.anddev.android.weatherforecast.weather.WeatherUtils;
  15. import org.xml.sax.InputSource;
  16. import org.xml.sax.XMLReader;
  17.  
  18. import android.app.Activity;
  19. import android.os.Bundle;
  20. import android.util.Log;
  21. import android.view.View;
  22. import android.view.View.OnClickListener;
  23. import android.widget.Button;
  24. import android.widget.CheckBox;
  25. import android.widget.EditText;
  26.  
  27. public class WeatherForecast extends Activity {
  28.  
  29.         private final String DEBUG_TAG = "WeatherForcaster";
  30.         private CheckBox chk_usecelsius = null;
  31.  
  32.         /** Called when the activity is first created. */
  33.         @Override
  34.         public void onCreate(Bundle icicle) {
  35.                 super.onCreate(icicle);
  36.                 setContentView(R.layout.main);
  37.  
  38.                 this.chk_usecelsius = (CheckBox) findViewById(R.id.chk_usecelsius);
  39.  
  40.                 Button cmd_submit = (Button) findViewById(R.id.cmd_submit);
  41.                 cmd_submit.setOnClickListener(new OnClickListener() {
  42.  
  43.                         @Override
  44.                         public void onClick(View arg0) {
  45.                                 URL url;
  46.                                 try {
  47.                                         /* Get what user typed to the EditText. */
  48.                                         String cityParamString = ((EditText) findViewById(R.id.edit_input))
  49.                                                         .getText().toString();
  50.                                         String queryString = "http://www.google.com/ig/api?weather="
  51.                                                         + cityParamString;
  52.                                         /* Replace blanks with HTML-Equivalent. */
  53.                                         url = new URL(queryString.replace(" ", "%20"));
  54.  
  55.                                         /* Get a SAXParser from the SAXPArserFactory. */
  56.                                         SAXParserFactory spf = SAXParserFactory.newInstance();
  57.                                         SAXParser sp = spf.newSAXParser();
  58.  
  59.                                         /* Get the XMLReader of the SAXParser we created. */
  60.                                         XMLReader xr = sp.getXMLReader();
  61.  
  62.                                         /*
  63.                                          * Create a new ContentHandler and apply it to the
  64.                                          * XML-Reader
  65.                                          */
  66.                                         GoogleWeatherHandler gwh = new GoogleWeatherHandler();
  67.                                         xr.setContentHandler(gwh);
  68.  
  69.                                         /* Parse the xml-data our URL-call returned. */
  70.                                         xr.parse(new InputSource(url.openStream()));
  71.  
  72.                                         /* Our Handler now provides the parsed weather-data to us. */
  73.                                         WeatherSet ws = gwh.getWeatherSet();
  74.  
  75.                                         /* Update the SingleWeatherInfoView with the parsed data. */
  76.                                         updateWeatherInfoView(R.id.weather_today, ws
  77.                                                         .getWeatherCurrentCondition());
  78.  
  79.                                         updateWeatherInfoView(R.id.weather_1, ws
  80.                                                         .getWeatherForecastConditions().get(0));
  81.                                         updateWeatherInfoView(R.id.weather_2, ws
  82.                                                         .getWeatherForecastConditions().get(1));
  83.                                         updateWeatherInfoView(R.id.weather_3, ws
  84.                                                         .getWeatherForecastConditions().get(2));
  85.                                         updateWeatherInfoView(R.id.weather_4, ws
  86.                                                         .getWeatherForecastConditions().get(3));
  87.  
  88.                                 } catch (Exception e) {
  89.                                         resetWeatherInfoViews();
  90.                                         Log.e(DEBUG_TAG, "WeatherQueryError", e);
  91.                                 }
  92.                         }
  93.                 });
  94.         }
  95.  
  96.         private void updateWeatherInfoView(int aResourceID,
  97.                         WeatherForecastCondition aWFIS) throws MalformedURLException {
  98.                
  99.                 /* Construct the Image-URL. */
  100.                 URL imgURL = new URL("http://www.google.com" + aWFIS.getIconURL());
  101.                 ((SingleWeatherInfoView) findViewById(aResourceID)).setRemoteImage(imgURL);
  102.  
  103.                 int tempMin = aWFIS.getTempMinCelsius();
  104.                 int tempMax = aWFIS.getTempMaxCelsius();
  105.  
  106.                 /* Convert from Celsius to Fahrenheit if necessary. */
  107.                 if (this.chk_usecelsius.isChecked()) {
  108.                         ((SingleWeatherInfoView) findViewById(aResourceID))
  109.                                         .setTempCelciusMinMax(tempMin, tempMax);
  110.                 } else {
  111.                         tempMin = WeatherUtils.celsiusToFahrenheit(tempMin);
  112.                         tempMax = WeatherUtils.celsiusToFahrenheit(tempMax);
  113.                         ((SingleWeatherInfoView) findViewById(aResourceID))
  114.                                         .setTempFahrenheitMinMax(tempMin, tempMax);
  115.                 }
  116.         }
  117.  
  118.         private void updateWeatherInfoView(int aResourceID,
  119.                         WeatherCurrentCondition aWCIS) throws MalformedURLException {
  120.                
  121.                 /* Construct the Image-URL. */
  122.                 URL imgURL = new URL("http://www.google.com" + aWCIS.getIconURL());
  123.                 ((SingleWeatherInfoView) findViewById(aResourceID)).setRemoteImage(imgURL);
  124.  
  125.                 /* Convert from Celsius to Fahrenheit if necessary. */
  126.                 if (this.chk_usecelsius.isChecked()){
  127.                         ((SingleWeatherInfoView) findViewById(aResourceID))
  128.                                         .setTempCelcius(aWCIS.getTempCelcius());
  129.                 }else{
  130.                         ((SingleWeatherInfoView) findViewById(aResourceID))
  131.                                         .setTempFahrenheit(aWCIS.getTempFahrenheit());
  132.                 }
  133.         }
  134.  
  135.         private void resetWeatherInfoViews() {
  136.                 ((SingleWeatherInfoView)findViewById(R.id.weather_today)).reset();
  137.                 ((SingleWeatherInfoView)findViewById(R.id.weather_1)).reset();
  138.                 ((SingleWeatherInfoView)findViewById(R.id.weather_2)).reset();
  139.                 ((SingleWeatherInfoView)findViewById(R.id.weather_3)).reset();
  140.                 ((SingleWeatherInfoView)findViewById(R.id.weather_4)).reset();
  141.         }
  142. }
Parsed in 0.051 seconds, using GeSHi 1.0.8.4




:idea: "/src/your_package_structure/views/SingleWeatherInfoView.java"
Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1. package org.anddev.android.weatherforecast.views;
  2.  
  3. import java.io.BufferedInputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.net.URL;
  7. import java.net.URLConnection;
  8. import java.util.Map;
  9.  
  10. import org.anddev.android.weatherforecast.R;
  11.  
  12. import android.content.Context;
  13. import android.graphics.Bitmap;
  14. import android.graphics.BitmapFactory;
  15. import android.graphics.Typeface;
  16. import android.util.AttributeSet;
  17. import android.widget.ImageView;
  18. import android.widget.LinearLayout;
  19. import android.widget.TextView;
  20.  
  21. /**
  22.  * The View capable of showing a WeatehrIcon + a Temperature-TextView.
  23.  */
  24. public class SingleWeatherInfoView extends LinearLayout {
  25.  
  26.         // ===========================================================
  27.         // Fields
  28.         // ===========================================================
  29.  
  30.         private ImageView myWeatherImageView = null;
  31.         private TextView myTempTextView = null;
  32.  
  33.         // ===========================================================
  34.         // Constructors
  35.         // ===========================================================
  36.  
  37.         public SingleWeatherInfoView(Context context) {
  38.                 super(context);
  39.         }
  40.  
  41.         public SingleWeatherInfoView(Context context, AttributeSet attrs,
  42.                         Map inflateParams) {
  43.                 super(context, attrs, inflateParams);
  44.                 /* Setup the ImageView that will show weather-icon. */
  45.                 this.myWeatherImageView = new ImageView(context);
  46.                 this.myWeatherImageView.setImageDrawable(getResources().getDrawable(
  47.                                 R.drawable.dunno));
  48.  
  49.                 /* Setup the textView that will show the temperature. */
  50.                 this.myTempTextView = new TextView(context);
  51.                 this.myTempTextView.setText("? °C");
  52.                 this.myTempTextView.setTextSize(16);
  53.                 this.myTempTextView.setTypeface(Typeface
  54.                                 .create("Tahoma", Typeface.BOLD));
  55.  
  56.                 /* Add child views to this object. */
  57.                 this.addView(this.myWeatherImageView, new LinearLayout.LayoutParams(
  58.                                 LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
  59.                 this.addView(this.myTempTextView, new LinearLayout.LayoutParams(
  60.                                 LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
  61.         }
  62.  
  63.         // ===========================================================
  64.         // Getter & Setter
  65.         // ===========================================================
  66.  
  67.         public void reset() {
  68.                 this.myWeatherImageView.setImageDrawable(getResources().getDrawable(
  69.                                 R.drawable.dunno));
  70.                 this.myTempTextView.setText("? °C");
  71.         }
  72.  
  73.         /** Sets the Child-ImageView of this to the URL passed. */
  74.         public void setRemoteImage(URL aURL) {
  75.                 try {
  76.                         URLConnection conn = aURL.openConnection();
  77.                         conn.connect();
  78.                         InputStream is = conn.getInputStream();
  79.                         BufferedInputStream bis = new BufferedInputStream(is);
  80.                         Bitmap bm = BitmapFactory.decodeStream(bis);
  81.                         bis.close();
  82.                         is.close();
  83.                         this.myWeatherImageView.setImageBitmap(bm);
  84.                 } catch (IOException e) {
  85.                         /* Reset to 'Dunno' on any error. */
  86.                         this.myWeatherImageView.setImageDrawable(getResources()
  87.                                         .getDrawable(R.drawable.dunno));
  88.                 }
  89.         }
  90.  
  91.         public void setTempCelcius(int aTemp) {
  92.                 this.myTempTextView.setText("" + aTemp + " °C");
  93.         }
  94.  
  95.         public void setTempFahrenheit(int aTemp) {
  96.                 this.myTempTextView.setText("" + aTemp + " °F");
  97.         }
  98.  
  99.         public void setTempFahrenheitMinMax(int aMinTemp, int aMaxTemp) {
  100.                 this.myTempTextView.setText("" + aMinTemp + "/" + aMaxTemp + " °F");
  101.         }
  102.  
  103.         public void setTempCelciusMinMax(int aMinTemp, int aMaxTemp) {
  104.                 this.myTempTextView.setText("" + aMinTemp + "/" + aMaxTemp + " °C");
  105.         }
  106.  
  107.         public void setTempString(String aTempString) {
  108.                 this.myTempTextView.setText(aTempString);
  109.         }
  110. }
Parsed in 0.050 seconds, using GeSHi 1.0.8.4




:idea: "/src/your_package_structure/weather/GoogleWeatherHandler.java"
Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1. package org.anddev.android.weatherforecast.weather;
  2.  
  3. import org.xml.sax.Attributes;
  4. import org.xml.sax.SAXException;
  5. import org.xml.sax.helpers.DefaultHandler;
  6.  
  7. /**
  8.  * SAXHandler capable of extracting information out of the xml-data returned by
  9.  * the Google Weather API.
  10.  */
  11. public class GoogleWeatherHandler extends DefaultHandler {
  12.  
  13.         // ===========================================================
  14.         // Fields
  15.         // ===========================================================
  16.  
  17.         private WeatherSet myWeatherSet = null;
  18.         private boolean in_forecast_information = false;
  19.         private boolean in_current_conditions = false;
  20.         private boolean in_forecast_conditions = false;
  21.  
  22.         private boolean usingSITemperature = false; // false means Fahrenheit
  23.  
  24.         // ===========================================================
  25.         // Constructors
  26.         // ===========================================================
  27.  
  28.         // ===========================================================
  29.         // Getter & Setter
  30.         // ===========================================================
  31.  
  32.         public WeatherSet getWeatherSet() {
  33.                 return this.myWeatherSet;
  34.         }
  35.  
  36.         // ===========================================================
  37.         // Methods
  38.         // ===========================================================
  39.         @Override
  40.         public void startDocument() throws SAXException {
  41.                 this.myWeatherSet = new WeatherSet();
  42.         }
  43.  
  44.         @Override
  45.         public void endDocument() throws SAXException {
  46.                 // Nothing
  47.         }
  48.  
  49.         @Override
  50.         public void startElement(String namespaceURI, String localName,
  51.                         String qName, Attributes atts) throws SAXException {
  52.                 // 'Outer' Tags
  53.                 if (localName.equals("forecast_information")) {
  54.                         this.in_forecast_information = true;
  55.                 } else if (localName.equals("current_conditions")) {
  56.                         this.myWeatherSet
  57.                                         .setWeatherCurrentCondition(new WeatherCurrentCondition());
  58.                         this.in_current_conditions = true;
  59.                 } else if (localName.equals("forecast_conditions")) {
  60.                         this.myWeatherSet.getWeatherForecastConditions().add(
  61.                                         new WeatherForecastCondition());
  62.                         this.in_forecast_conditions = true;
  63.                 } else {
  64.                         String dataAttribute = atts.getValue("data");
  65.                         // 'Inner' Tags of "<forecast_information>"
  66.                         if (localName.equals("city")) {
  67.                         } else if (localName.equals("postal_code")) {
  68.                         } else if (localName.equals("latitude_e6")) {
  69.                                 /* One could use this to convert city-name to Lat/Long. */
  70.                         } else if (localName.equals("longitude_e6")) {
  71.                                 /* One could use this to convert city-name to Lat/Long. */
  72.                         } else if (localName.equals("forecast_date")) {
  73.                         } else if (localName.equals("current_date_time")) {
  74.                         } else if (localName.equals("unit_system")) {
  75.                                 if (dataAttribute.equals("SI"))
  76.                                         this.usingSITemperature = true;
  77.                         }
  78.                         // SHARED(!) 'Inner' Tags within "<current_conditions>" AND
  79.                         // "<forecast_conditions>"
  80.                         else if (localName.equals("day_of_week")) {
  81.                                 if (this.in_current_conditions) {
  82.                                         this.myWeatherSet.getWeatherCurrentCondition()
  83.                                                         .setDayofWeek(dataAttribute);
  84.                                 } else if (this.in_forecast_conditions) {
  85.                                         this.myWeatherSet.getLastWeatherForecastCondition()
  86.                                                         .setDayofWeek(dataAttribute);
  87.                                 }
  88.                         } else if (localName.equals("icon")) {
  89.                                 if (this.in_current_conditions) {
  90.                                         this.myWeatherSet.getWeatherCurrentCondition().setIconURL(
  91.                                                         dataAttribute);
  92.                                 } else if (this.in_forecast_conditions) {
  93.                                         this.myWeatherSet.getLastWeatherForecastCondition()
  94.                                                         .setIconURL(dataAttribute);
  95.                                 }
  96.                         } else if (localName.equals("condition")) {
  97.                                 if (this.in_current_conditions) {
  98.                                         this.myWeatherSet.getWeatherCurrentCondition()
  99.                                                         .setCondition(dataAttribute);
  100.                                 } else if (this.in_forecast_conditions) {
  101.                                         this.myWeatherSet.getLastWeatherForecastCondition()
  102.                                                         .setCondition(dataAttribute);
  103.                                 }
  104.                         }
  105.                         // 'Inner' Tags within "<current_conditions>"
  106.                         else if (localName.equals("temp_f")) {
  107.                                 this.myWeatherSet.getWeatherCurrentCondition()
  108.                                                 .setTempFahrenheit(Integer.parseInt(dataAttribute));
  109.                         } else if (localName.equals("temp_c")) {
  110.                                 this.myWeatherSet.getWeatherCurrentCondition().setTempCelcius(
  111.                                                 Integer.parseInt(dataAttribute));
  112.                         } else if (localName.equals("humidity")) {
  113.                                 this.myWeatherSet.getWeatherCurrentCondition().setHumidity(
  114.                                                 dataAttribute);
  115.                         } else if (localName.equals("wind_condition")) {
  116.                                 this.myWeatherSet.getWeatherCurrentCondition()
  117.                                                 .setWindCondition(dataAttribute);
  118.                         }
  119.                         // 'Inner' Tags within "<forecast_conditions>"
  120.                         else if (localName.equals("low")) {
  121.                                 int temp = Integer.parseInt(dataAttribute);
  122.                                 if (this.usingSITemperature) {
  123.                                         this.myWeatherSet.getLastWeatherForecastCondition()
  124.                                                         .setTempMinCelsius(temp);
  125.                                 } else {
  126.                                         this.myWeatherSet.getLastWeatherForecastCondition()
  127.                                                         .setTempMinCelsius(
  128.                                                                         WeatherUtils.fahrenheitToCelsius(temp));
  129.                                 }
  130.                         } else if (localName.equals("high")) {
  131.                                 int temp = Integer.parseInt(dataAttribute);
  132.                                 if (this.usingSITemperature) {
  133.                                         this.myWeatherSet.getLastWeatherForecastCondition()
  134.                                                         .setTempMaxCelsius(temp);
  135.                                 } else {
  136.                                         this.myWeatherSet.getLastWeatherForecastCondition()
  137.                                                         .setTempMaxCelsius(
  138.                                                                         WeatherUtils.fahrenheitToCelsius(temp));
  139.                                 }
  140.                         }
  141.                 }
  142.         }
  143.  
  144.         @Override
  145.         public void endElement(String namespaceURI, String localName, String qName)
  146.                         throws SAXException {
  147.                 if (localName.equals("forecast_information")) {
  148.                         this.in_forecast_information = false;
  149.                 } else if (localName.equals("current_conditions")) {
  150.                         this.in_current_conditions = false;
  151.                 } else if (localName.equals("forecast_conditions")) {
  152.                         this.in_forecast_conditions = false;
  153.                 }
  154.         }
  155.  
  156.         @Override
  157.         public void characters(char ch[], int start, int length) {
  158.                 /*
  159.                  * Would be called on the following structure: <element>characters</element>
  160.                  */
  161.         }
  162. }
Parsed in 0.059 seconds, using GeSHi 1.0.8.4




:idea: "/src/your_package_structure/weather/WeatherCurrentCondition.java"
Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1. package org.anddev.android.weatherforecast.weather;
  2.  
  3. /**
  4.  * Holds the information between the <current_conditions>-tag of what the Google
  5.  * Weather API returned.
  6.  */
  7. public class WeatherCurrentCondition {
  8.  
  9.         // ===========================================================
  10.         // Fields
  11.         // ===========================================================
  12.  
  13.         private String dayofWeek = null;
  14.         private Integer tempCelcius = null;
  15.         private Integer tempFahrenheit = null;
  16.         private String iconURL = null;
  17.         private String condition = null;
  18.         private String windCondition = null;
  19.         private String humidity = null;
  20.  
  21.         // ===========================================================
  22.         // Constructors
  23.         // ===========================================================
  24.  
  25.         public WeatherCurrentCondition() {
  26.  
  27.         }
  28.  
  29.         // ===========================================================
  30.         // Getter & Setter
  31.         // ===========================================================
  32.  
  33.         public String getDayofWeek() {
  34.                 return this.dayofWeek;
  35.         }
  36.  
  37.         public void setDayofWeek(String dayofWeek) {
  38.                 this.dayofWeek = dayofWeek;
  39.         }
  40.  
  41.         public Integer getTempCelcius() {
  42.                 return this.tempCelcius;
  43.         }
  44.  
  45.         public void setTempCelcius(Integer temp) {
  46.                 this.tempCelcius = temp;
  47.         }
  48.  
  49.         public Integer getTempFahrenheit() {
  50.                 return this.tempFahrenheit;
  51.         }
  52.  
  53.         public void setTempFahrenheit(Integer temp) {
  54.                 this.tempFahrenheit = temp;
  55.         }
  56.  
  57.         public String getIconURL() {
  58.                 return this.iconURL;
  59.         }
  60.  
  61.         public void setIconURL(String iconURL) {
  62.                 this.iconURL = iconURL;
  63.         }
  64.  
  65.         public String getCondition() {
  66.                 return this.condition;
  67.         }
  68.  
  69.         public void setCondition(String condition) {
  70.                 this.condition = condition;
  71.         }
  72.  
  73.         public String getWindCondition() {
  74.                 return this.windCondition;
  75.         }
  76.  
  77.         public void setWindCondition(String windCondition) {
  78.                 this.windCondition = windCondition;
  79.         }
  80.  
  81.         public String getHumidity() {
  82.                 return this.humidity;
  83.         }
  84.  
  85.         public void setHumidity(String humidity) {
  86.                 this.humidity = humidity;
  87.         }
  88. }
Parsed in 0.042 seconds, using GeSHi 1.0.8.4




:idea: "/src/your_package_structure/weather/WeatherForecastCondition.java"
Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1. package org.anddev.android.weatherforecast.weather;
  2.  
  3. /**
  4.  * Holds the information between the <forecast_conditions>-tag of what the
  5.  * Google Weather API returned.
  6.  */
  7. public class WeatherForecastCondition {
  8.  
  9.         // ===========================================================
  10.         // Fields
  11.         // ===========================================================
  12.  
  13.         private String dayofWeek = null;
  14.         private Integer tempMin = null;
  15.         private Integer tempMax = null;
  16.         private String iconURL = null;
  17.         private String condition = null;
  18.  
  19.         // ===========================================================
  20.         // Constructors
  21.         // ===========================================================
  22.  
  23.         public WeatherForecastCondition() {
  24.  
  25.         }
  26.  
  27.         // ===========================================================
  28.         // Getter & Setter
  29.         // ===========================================================
  30.  
  31.         public String getDayofWeek() {
  32.                 return dayofWeek;
  33.         }
  34.  
  35.         public void setDayofWeek(String dayofWeek) {
  36.                 this.dayofWeek = dayofWeek;
  37.         }
  38.  
  39.         public Integer getTempMinCelsius() {
  40.                 return tempMin;
  41.         }
  42.  
  43.         public void setTempMinCelsius(Integer tempMin) {
  44.                 this.tempMin = tempMin;
  45.         }
  46.  
  47.         public Integer getTempMaxCelsius() {
  48.                 return tempMax;
  49.         }
  50.  
  51.         public void setTempMaxCelsius(Integer tempMax) {
  52.                 this.tempMax = tempMax;
  53.         }
  54.  
  55.         public String getIconURL() {
  56.                 return iconURL;
  57.         }
  58.  
  59.         public void setIconURL(String iconURL) {
  60.                 this.iconURL = iconURL;
  61.         }
  62.  
  63.         public String getCondition() {
  64.                 return condition;
  65.         }
  66.  
  67.         public void setCondition(String condition) {
  68.                 this.condition = condition;
  69.         }
  70. }
Parsed in 0.041 seconds, using GeSHi 1.0.8.4




:idea: "/src/your_package_structure/weather/WeatherSet.java"
Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1. package org.anddev.android.weatherforecast.weather;
  2.  
  3. import java.util.ArrayList;
  4.  
  5. /**
  6.  * Combines one WeatherCurrentCondition with a List of
  7.  * WeatherForecastConditions.
  8.  */
  9. public class WeatherSet {
  10.        
  11.         // ===========================================================
  12.         // Fields
  13.         // ===========================================================
  14.  
  15.         private WeatherCurrentCondition myCurrentCondition = null;
  16.         private ArrayList<WeatherForecastCondition> myForecastConditions =
  17.                 new ArrayList<WeatherForecastCondition>(4);
  18.  
  19.         // ===========================================================
  20.         // Getter & Setter
  21.         // ===========================================================
  22.  
  23.         public WeatherCurrentCondition getWeatherCurrentCondition() {
  24.                 return myCurrentCondition;
  25.         }
  26.  
  27.         public void setWeatherCurrentCondition(
  28.                         WeatherCurrentCondition myCurrentWeather) {
  29.                 this.myCurrentCondition = myCurrentWeather;
  30.         }
  31.  
  32.         public ArrayList<WeatherForecastCondition> getWeatherForecastConditions() {
  33.                 return this.myForecastConditions;
  34.         }
  35.  
  36.         public WeatherForecastCondition getLastWeatherForecastCondition() {
  37.                 return this.myForecastConditions
  38.                                 .get(this.myForecastConditions.size() - 1);
  39.         }
  40. }
Parsed in 0.040 seconds, using GeSHi 1.0.8.4




:idea: "/src/your_package_structure/weather/WeatherUtils.java"[syntax="java"]
Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1. package org.anddev.android.weatherforecast.weather;
  2.  
  3. /** Useful Utility in working with temperatures. (conversions). */
  4. public class WeatherUtils {
  5.  
  6.         public static int fahrenheitToCelsius(int tFahrenheit) {
  7.                 return (int) ((5.0f / 9.0f) * (tFahrenheit - 32));
  8.         }
  9.  
  10.         public static int celsiusToFahrenheit(int tCelsius) {
  11.                 return (int) ((9.0f / 5.0f) * tCelsius + 32);
  12.         }
  13. }
Parsed in 0.037 seconds, using GeSHi 1.0.8.4


Regards & Merry Christmas,
plusminus :xmas:
Attachments
weatherforecast_m5-rc14.zip
WeatherForecast Tutorial for SDK m5-rc14
(490.31 KiB) Downloaded 10898 times
Last edited by plusminus on Thu Feb 28, 2008 2:21 am, edited 2 times in total.
Image
Image | Android Development Community / Tutorials
User avatar
plusminus
Site Admin
Site Admin
 
Posts: 2688
Joined: Wed Nov 14, 2007 8:37 pm
Location: Schriesheim, Germany

Top

Postby venkat » Wed Dec 26, 2007 7:26 am

:) :) :) :) once again best tutorial.

Merry Christmas

Venkat. :D
venkat
Senior Developer
Senior Developer
 
Posts: 152
Joined: Tue Nov 27, 2007 5:42 am
Location: India

Postby venkat » Wed Dec 26, 2007 7:27 am

hi Plusminu,
i can't able to download your poject.. :(

Regards,
Venkat
venkat
Senior Developer
Senior Developer
 
Posts: 152
Joined: Tue Nov 27, 2007 5:42 am
Location: India

Postby Katharnavas » Wed Dec 26, 2007 1:07 pm

Hi,
It worked great for me ...

venkat wrote:hi Plusminu,
i can't able to download your poject.. :(

Regards,
Venkat
Katharnavas
Senior Developer
Senior Developer
 
Posts: 100
Joined: Tue Dec 04, 2007 5:57 am
Location: India

Postby plusminus » Wed Dec 26, 2007 11:11 pm

Hello venkat,

perhaps copy paste the link instead of clicking it:

images/tut/weatherforecast/weatherforecast_fullsource_by_anddev_org.zip

Regards,
plusminus
Image
Image | Android Development Community / Tutorials
User avatar
plusminus
Site Admin
Site Admin
 
Posts: 2688
Joined: Wed Nov 14, 2007 8:37 pm
Location: Schriesheim, Germany

Postby cabernet1976 » Thu Jan 10, 2008 5:48 pm

Hi plusminus,

Could you tell me how to write the bitmap to a file?
Thanks.
Upload2Flickr's blog: http://upload2flickr.blogspot.com
cabernet1976
Senior Developer
Senior Developer
 
Posts: 154
Joined: Fri Nov 16, 2007 2:34 am
Location: China

Top

Postby plusminus » Thu Jan 10, 2008 6:27 pm

cabernet1976 wrote:Hi plusminus,

Could you tell me how to write the bitmap to a file?
Thanks.


Hello cabernet1976,

you are talkign of the downloaded WeatherIcons, right :?:
This should be working (had it in SingleWeatherInfoView.setRemoteImage(URL aURL){...):
Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1.                 OutputStream outStream = null;
  2.                 try {
  3.                         outStream = this.openFileOutput("image.png", MODE_WORLD_READABLE);
  4.                         bm.compress(Bitmap.CompressFormat.PNG, 100, outStream);
  5.                 } catch (FileNotFoundException e) {
  6.                         e.printStackTrace();
  7.                 }
Parsed in 0.036 seconds, using GeSHi 1.0.8.4


Tell us if it helped you :)

Regards,
plusminus
Image
Image | Android Development Community / Tutorials
User avatar
plusminus
Site Admin
Site Admin
 
Posts: 2688
Joined: Wed Nov 14, 2007 8:37 pm
Location: Schriesheim, Germany

Postby cabernet1976 » Fri Jan 11, 2008 2:20 am

Thanks plusminus, it is really what I want. I will try it and reply the result here.

I am a novice in Java, so the question I asked is very rudimental.
Upload2Flickr's blog: http://upload2flickr.blogspot.com
cabernet1976
Senior Developer
Senior Developer
 
Posts: 154
Joined: Fri Nov 16, 2007 2:34 am
Location: China

error when running weather app

Postby oladapo » Fri Jan 11, 2008 10:56 pm

When I download the source files and then try to run the program I get..

The method onClick(View) of type new View.OnClickListener(){} must override a superclass method

Is there an error somewhere?

Thanks,

Dapo
oladapo
Freshman
Freshman
 
Posts: 3
Joined: Mon Jan 07, 2008 6:30 pm
Location: Philadelphia

Postby plusminus » Fri Jan 11, 2008 11:15 pm

Hello oladapo,

removing the @Override-Annotation is the solution to your problem (or commenting it out.
This happens because the JDK 1.5, you are probably running, does accept @Override-Annotation only for overridden methods of Super-Classes and not for overriding functions of Interfaces we are implementing here.

On JDK 1.6 this Annotation is possible. :roll:

So this is a kind of style-issue.

Regards,
plusminus
Image
Image | Android Development Community / Tutorials
User avatar
plusminus
Site Admin
Site Admin
 
Posts: 2688
Joined: Wed Nov 14, 2007 8:37 pm
Location: Schriesheim, Germany

Postby oladapo » Sat Jan 12, 2008 12:08 am

Hey plusminus,

awesome it worked. damn you're good.
oladapo
Freshman
Freshman
 
Posts: 3
Joined: Mon Jan 07, 2008 6:30 pm
Location: Philadelphia

Postby zsimplicityz » Tue May 13, 2008 9:08 am

Downloaded your program.
It works just fine till this error msg appear .
What can I do to solve it ?

Here's the screenshot ..

Image
zsimplicityz
Junior Developer
Junior Developer
 
Posts: 14
Joined: Wed Apr 23, 2008 8:19 am

Postby plusminus » Thu May 22, 2008 6:01 pm

Hello zsimplicityz,

I didn't place the query in a Thread (would everything except smart on an actual device), try that (remember to do UI-updates not inside the thread but in "[font=Courier New]runOnUiThread(Runnable r)[/font]"

Regards,
plusminus
Image
Image | Android Development Community / Tutorials
User avatar
plusminus
Site Admin
Site Admin
 
Posts: 2688
Joined: Wed Nov 14, 2007 8:37 pm
Location: Schriesheim, Germany

Postby phpandroid » Sun Jun 22, 2008 12:26 pm

Hi plusminus,
I tried to use SAX to handler XML from Google Weather without Android (only using Console)

class WeatherForecast:
Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1. package test.googlewhether;
  2.  
  3. import org.anddev.android.weatherforecast.weather.GoogleWeatherHandler;
  4. import org.anddev.android.weatherforecast.weather.WeatherSet;
  5. import java.net.URL;
  6. import javax.xml.parsers.SAXParser;
  7. import javax.xml.parsers.SAXParserFactory;
  8. import org.xml.sax.InputSource;
  9. import org.xml.sax.XMLReader;
  10.  
  11. import java.net.URL;
  12.  
  13. import javax.xml.parsers.SAXParser;
  14. import javax.xml.parsers.SAXParserFactory;
  15.  
  16. import org.xml.sax.InputSource;
  17. import org.xml.sax.XMLReader;
  18.  
  19. public class WeatherForecast {
  20.     public static void main(String args[]) {
  21.         try {
  22.             URL url;
  23.             url = new URL("http://www.google.com/ig/api?weather=Schriesheim,Germany");
  24.  
  25.             SAXParserFactory spf = SAXParserFactory.newInstance();
  26.             SAXParser sp = spf.newSAXParser();
  27.  
  28.             XMLReader xr = sp.getXMLReader();
  29.  
  30.             GoogleWeatherHandler gwh = new GoogleWeatherHandler();
  31.             xr.setContentHandler(gwh);
  32.  
  33.             xr.parse(new InputSource(url.openStream()));
  34.  
  35.             WeatherSet ws = gwh.getWeatherSet();
  36.  
  37.             System.out.println(ws.getWeatherCurrentCondition().getIconURL());
  38.         } catch (Exception e) {
  39.             System.out.println(e.toString());
  40.         }
  41.     }
  42. }
  43.  
Parsed in 0.041 seconds, using GeSHi 1.0.8.4


These classes: GoogleWeatherHandler, WeatherSet, WeatherCurrentCondition, WeatherForecastCondition, WeatherUtils are not change.

The result is: java.lang.NullPointerException. I debug with Netbean then see that: line xr.parse(new InputSource(url.openStream())); cannot handle xml. I don't understand why :(

Please help me. I need urgently. Thank you very much!
phpandroid
Once Poster
Once Poster
 
Posts: 1
Joined: Sun Jun 22, 2008 11:45 am

Postby ohyes » Fri Jul 10, 2009 3:03 am

The post sounds great :)
But I can't run the application downloaded :(
The matter is that [super(context, attrs, inflateParams);] in the SingleWeatherInfoView show the following ERROR:
The constructor LinearLayout(Context, AttributeSet, Map) is undefined
Remove arg to match...

Could U please tell me how to fix it and enjoy the app (*.java & *.xml keep unchanged)

Thank you in advance,
ohyes
Junior Developer
Junior Developer
 
Posts: 10
Joined: Fri Jul 10, 2009 2:51 am

Top
Next

Return to Advanced Tutorials

Who is online

Users browsing this forum: Yahoo [Bot] and 3 guests