我正在构建一个Android应用程序(我正在使用Kotlin而不是JAVA,但如果你能让我得到Java的方法很好)那应该使用OpenWeather API来显示天气信息。我已经设置了视图:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="@dimen/activity_horizontal_margin">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/layCity">
<TextView
android:id="@+id/txtCity"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="PORTO"
android:textSize="25sp"
android:textStyle="bold"/>
<TextView
android:id="@+id/txtCountry"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="(PT)"
android:textSize="25sp"/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/layTempDetail"
android:layout_below="@+id/layCity"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/txtCurTemp"
android:text="20º"
android:textSize="40sp"
android:textStyle="bold"
android:layout_marginTop="20dp"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/lblMinTemp"
android:text="Min:"
android:textStyle="bold"
android:textSize="20sp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/txtMinTemp"
android:text="10º"
android:textSize="20sp"/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/lblMaxTemp"
android:text="Max:"
android:textStyle="bold"
android:textSize="20sp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/txtMaxTemp"
android:text="30º"
android:textSize="20sp"/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/lblPressure"
android:text="Pressure:"
android:textStyle="bold"
android:textSize="20sp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/txtPressure"
android:text="100"
android:textSize="20sp"/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/lblHumidity"
android:text="Humidity:"
android:textStyle="bold"
android:textSize="20sp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/txtHumidity"
android:text="30%"
android:textSize="20sp"/>
</LinearLayout>
</LinearLayout>
</RelativeLayout>
然后我有另一个类负责发出请求并单独更改每个字段:
public fun getCityInfo(name: String){
val URI = String.format("http://api.openweathermap.org/data/2.5/weather?q=%s&appid=", name)
Log.d("uri", URI)
var cityName: String = ""
queue.add(JsonObjectRequest(
URI,
null,
{
cityName = it.getString("name")
var main = it.getJSONObject("main")
var temp: Double = main.getDouble("temp")
//getting the rest of the info
//I save the info that I need in a class
var currTemp = CurrentTemperature(temp,press,humidity,min,max,state,desc,icon)
var city = City(name, currTemp)
//then set each field individually
var detailsview = (context as AppCompatActivity).findViewById(R.id.layDetails) as View
(detailsview.findViewById(R.id.txtCity) as TextView).setText(city.name)
(detailsview.findViewById(R.id.txtCurTemp) as TextView).setText(city.currTemp.curr.toString())
},
{
Toast.makeText(context, "Failed to get weather", Toast.LENGTH_LONG).show()
}
但我想要的是返回城市实例成功,然后我在我的字段中有一些自动更新视图的绑定。
我怎样才能做到这一点?
答案 0 :(得分:1)
根本不知道Kotlin,但我会尝试使用Java术语来解释。
重新定义您的方法以接受Volley侦听器作为Activity的回调。
public fun getCityInfo(name: String, callback: Response.Listener<JSONObject>)
然后,调用该函数,将此闭包作为callback
getCityInfo("Chicago",
{
var cityName = it.getString("name")
var main = it.getJSONObject("main")
var temp: Double = main.getDouble("temp")
//getting the rest of the info
var currTemp = CurrentTemperature(temp,press,humidity,min,max,state,desc,icon)
var city = City(name, currTemp)
setCity(city) // TODO: implement method within Activity
})
注意添加了setCity
。您需要实现它来更新您拥有的任何视图。
现在,在其他类中,只需从Activity
传递响应侦听器queue.add(JsonObjectRequest(
URI,
null,
callback,
{ ... } // error handle