Welcome to the Treehouse Community
Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project?
Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community!
While you're at it, check out some resources Treehouse students have shared
here
.
Looking to learn something new?
Treehouse offers a seven day free trial for new students.
Get access to thousands of hours of content and join thousands of
Treehouse students and alumni in the community today.
Start your free trial
import
android.content.Context
;
import
android.databinding.DataBindingUtil
;
import
android.net.ConnectivityManager
;
import
android.net.Network
;
import
android.net.NetworkInfo
;
import
android.support.v7.app.AppCompatActivity
;
import
android.os.Bundle
;
import
android.text.method.LinkMovementMethod
;
import
android.util.Log
;
import
android.widget.TextView
;
import
android.widget.Toast
;
import
com.example.stormz.databinding.ActivityMainBinding
;
import
org.jetbrains.annotations.NotNull
;
import
org.json.JSONException
;
import
org.json.JSONObject
;
import
java.io.IOException
;
import
okhttp3.Call
;
import
okhttp3.Callback
;
import
okhttp3.OkHttpClient
;
import
okhttp3.Request
;
import
okhttp3.Response
;
public
class
MainActivity
extends
AppCompatActivity
{
private
static
final
String
TAG
=
MainActivity
.
class
.
getSimpleName
();
private
CurrentWeather
currentWeather
;
@Override
protected
void
onCreate
(
Bundle
savedInstanceState
)
{
super
.
onCreate
(
savedInstanceState
);
final
ActivityMainBinding
binding
=
DataBindingUtil
.
setContentView
(
MainActivity
.
this
,
R
.
layout
.
activity_main
);
TextView
darkSky
=
findViewById
(
R
.
id
.
darkSkyAttribution
);
darkSky
.
setMovementMethod
(
LinkMovementMethod
.
getInstance
());
String
apiKey
=
"95ae1bd15e1ca7ca1bcd99a0d5650482"
;
double
latitude
=
37.8267
;
double
longitude
=
-
122.4233
;
String
forecastURL
=
"https://api.darksky.net/forecast/"
+
apiKey
+
"/"
+
latitude
+
","
+
longitude
;
if
(
isNetworkAvailable
())
{
OkHttpClient
client
=
new
OkHttpClient
();
Request
request
=
new
Request
.
Builder
()
.
url
(
forecastURL
)
.
build
();
Call
call
=
client
.
newCall
(
request
);
call
.
enqueue
(
new
Callback
()
{
@Override
public
void
onFailure
(
Call
call
,
IOException
e
)
{
@Override
public
void
onResponse
(
Call
call
,
Response
response
)
throws
IOException
{
try
{
String
jsonData
=
response
.
body
().
string
();
Log
.
v
(
TAG
,
jsonData
);
if
(
response
.
isSuccessful
())
{
currentWeather
=
getCurrentDetails
(
jsonData
);
CurrentWeather
displayWeather
=
new
CurrentWeather
(
currentWeather
.
getLocationLabel
(),
currentWeather
.
getIcon
(),
currentWeather
.
getTime
(),
currentWeather
.
getTemperature
(),
currentWeather
.
getHumidity
(),
currentWeather
.
getPrecipChance
(),
currentWeather
.
getSummary
(),
currentWeather
.
getTimeZone
()
binding
.
setWeather
(
displayWeather
);
}
else
{
alertUserAboutError
();
}
catch
(
IOException
e
)
{
Log
.
e
(
TAG
,
"IO Exception caught: "
,
e
);
}
catch
(
JSONException
e
)
{
Log
.
e
(
TAG
,
"JSON Exception Caught:"
,
e
);
Log
.
d
(
TAG
,
"Main UI code is running, horray!"
);
private
CurrentWeather
getCurrentDetails
(
String
jsonData
)
throws
JSONException
{
JSONObject
forecast
=
new
JSONObject
(
jsonData
);
String
timezone
=
forecast
.
getString
(
"timezone"
);
Log
.
i
(
TAG
,
"From JSON: "
+
timezone
);
JSONObject
currently
=
forecast
.
getJSONObject
(
"currently"
);
CurrentWeather
currentWeather
=
new
CurrentWeather
();
currentWeather
.
setHumidity
(
currently
.
getDouble
(
"humidity"
));
currentWeather
.
setTime
(
currently
.
getLong
(
"time"
));
currentWeather
.
setIcon
(
currently
.
getString
(
"icon"
));
currentWeather
.
setLocationLabel
(
"Alcatraz Island, CA"
);
currentWeather
.
setPrecipChance
(
currently
.
getDouble
(
"precipProbability"
));
currentWeather
.
setSummary
(
currently
.
getString
(
"summary"
));
currentWeather
.
setTemperature
(
currently
.
getDouble
(
"temperature"
));
currentWeather
.
setTimeZone
(
timezone
);
Log
.
d
(
TAG
,
currentWeather
.
getFormattedTime
());
return
currentWeather
;
private
boolean
isNetworkAvailable
()
{
ConnectivityManager
manager
=
(
ConnectivityManager
)
getSystemService
(
Context
.
CONNECTIVITY_SERVICE
);
NetworkInfo
networkInfo
=
manager
.
getActiveNetworkInfo
();
boolean
isAvailable
=
false
;
if
(
networkInfo
!=
null
&&
networkInfo
.
isConnected
())
{
isAvailable
=
true
;
}
else
{
Toast
.
makeText
(
this
,
getString
(
R
.
string
.
network_unavailable_message
),
Toast
.
LENGTH_LONG
).
show
();
return
isAvailable
;
private
void
alertUserAboutError
()
{
AlertDialogFragment
dialog
=
new
AlertDialogFragment
();
dialog
.
show
(
getFragmentManager
(),
"error_dialog"
);
if the problem is that it does not recognize ActivityMainBinding then try to sync the 'build.gradle' app file. According to the video's you should have added 'databinding enabled = true' in this file. After that you need to sync this file in order to recognize the databinding object and generated methods.