你的位置:首页 > 操作系统

[操作系统]点击返回活动和刷新(三)


1. 更改天气的界面

weather_layout.

<LinearLayout ="http://schemas.android.com/apk/res/android"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:orientation="vertical" >  <RelativeLayout    android:layout_width="match_parent"    android:layout_height="50dp"    android:background="#484E61" >    <Button      android:id="@+id/switch_city"      android:layout_width="30dp"      android:layout_height="30dp"      android:layout_centerVertical="true"      android:layout_marginLeft="10dp"      android:background="@drawable/home" />    <TextView      android:id="@+id/city_name"      android:layout_width="wrap_content"      android:layout_height="wrap_content"      android:layout_centerInParent="true"      android:textColor="#fff"      android:textSize="24sp" />    <Button      android: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>  <RelativeLayout    android:layout_width="match_parent"    android:layout_height="0dp"    android:layout_weight="1"    android:background="#27A5F9" >    <TextView      android: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" />    <LinearLayout      android:id="@+id/weather_info_layout"      android:layout_width="wrap_content"      android:layout_height="wrap_content"      android:layout_centerInParent="true"      android:orientation="vertical" >      <TextView        android:id="@+id/current_date"        android:layout_width="wrap_content"        android:layout_height="40dp"        android:gravity="center"        android:textColor="#FFF"        android:textSize="18sp" />      <TextView        android: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" />      <LinearLayout        android:layout_width="wrap_content"        android:layout_height="60dp"        android:layout_gravity="center_horizontal"        android:orientation="horizontal" >        <TextView          android:id="@+id/temp1"          android:layout_width="wrap_content"          android:layout_height="wrap_content"          android:layout_gravity="center_vertical"          android:textColor="#FFF"          android:textSize="40sp" />        <TextView          android: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" />        <TextView          android: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. 对应的天气活动,更新天气从SharedPreferences文件中读取天气代码,在queryWeatherInfo()方法去更新天气

weatherActivity.java

 

import android.app.Activity;import android.content.Intent;import android.content.SharedPreferences;import android.os.Bundle;import android.preference.PreferenceManager;import android.text.TextUtils;import android.view.View;import android.view.View.OnClickListener;import android.view.Window;import android.widget.Button;import android.widget.LinearLayout;import android.widget.TextView;public class WeatherActivity extends Activity implements OnClickListener {  private LinearLayout weatherInfoLayout;  /**   * 用于显示城市名 第 14 章 进入实战,开发酷欧天气 533   */  private TextView cityNameText;  /**   * 用于显示发布时间   */  private TextView publishText;  /**   * 用于显示天气描述信息   */  private TextView weatherDespText;  /**   * 用于显示气温1   */  private TextView temp1Text;  /**   * 用于显示气温2   */  private TextView temp2Text;  /**   * 用于显示当前日期   */  private TextView currentDateText;  /**   * 切换城市按钮   */  private Button switchCity;  /**   * 更新天气按钮   */  private Button refreshWeather;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    requestWindowFeature(Window.FEATURE_NO_TITLE);    setContentView(R.layout.weather_layout);    // 初始化各控件    weatherInfoLayout = (LinearLayout) findViewById(R.id.weather_info_layout);    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);    switchCity = (Button) findViewById(R.id.switch_city);    refreshWeather = (Button) findViewById(R.id.refresh_weather);    String countyCode = getIntent().getStringExtra("county_code");    if (!TextUtils.isEmpty(countyCode)) {      // 有县级代号时就去查询天气      publishText.setText("同步中...");      weatherInfoLayout.setVisibility(View.INVISIBLE);      cityNameText.setVisibility(View.INVISIBLE);      queryWeatherCode(countyCode);    } else {      // 没有县级代号时就直接显示本地天气      showWeather();    }    switchCity.setOnClickListener(this);    refreshWeather.setOnClickListener(this);  }  @Override  public void onClick(View v) {    switch (v.getId()) {    case R.id.switch_city:      Intent intent = new Intent(this, ChooseAreaActivity.class);      intent.putExtra("from_weather_activity", true);      startActivity(intent);      finish();      break;    case R.id.refresh_weather:      publishText.setText(" 同步中...");      SharedPreferences prefs = PreferenceManager          .getDefaultSharedPreferences(this);      String weatherCode = prefs.getString("weather_code", "");      if (!TextUtils.isEmpty(weatherCode)) {        queryWeatherInfo(weatherCode);      }      break;    default:      break;    }  }  /**   * 查询县级代号所对应的天气代号。   */  private void queryWeatherCode(String countyCode) {    String address = "http://www.weather.com.cn/data/list3/city"        + countyCode + ".;    queryFromServer(address, "countyCode");  }  /**   * 查询天气代号所对应的天气。   */  private void queryWeatherInfo(String weatherCode) {    String address = "http://www.weather.com.cn/data/cityinfo/"        + weatherCode + ".html";    queryFromServer(address, "weatherCode");  }  /**   * 根据传入的地址和类型去向服务器查询天气代号或者天气信息。   */  private void queryFromServer(final String address, final String type) {    HttpUtil.sendHttpRequest(address, new HttpCallbackListener() {      @Override      public void onFinish(final String response) {        if ("countyCode".equals(type)) {          if (!TextUtils.isEmpty(response)) {            // 从服务器返回的数据中解析出天气代号            String[] array = response.split("\\|");            if (array != null && array.length == 2) {              String weatherCode = array[1];              queryWeatherInfo(weatherCode);            }          }        } else if ("weatherCode".equals(type)) {          // 处理服务器返回的天气信息          Utility.handleWeatherResponse(WeatherActivity.this,              response);          runOnUiThread(new Runnable() {            @Override            public void run() {              showWeather();            }          });        }      }      @Override      public void onError(Exception e) {        runOnUiThread(new Runnable() {          @Override          public void run() {            publishText.setText("同步失败");          }        });      }    });  }  /**   * 从SharedPreferences文件中读取存储的天气信息,并显示到界面上。   */  private void showWeather() {    SharedPreferences prefs = PreferenceManager        .getDefaultSharedPreferences(this);    cityNameText.setText(prefs.getString("city_name", ""));    temp1Text.setText(prefs.getString("temp1", ""));    temp2Text.setText(prefs.getString("temp2", ""));    weatherDespText.setText(prefs.getString("weather_desp", ""));    publishText.setText("今天" + prefs.getString("publish_time", "") + "发布");    currentDateText.setText(prefs.getString("current_date", ""));    weatherInfoLayout.setVisibility(View.VISIBLE);    cityNameText.setVisibility(View.VISIBLE);  }}

3. 天气界面返回 到ChooseAreaActivity选择城市界面 ,用一个标志位判断,修改ChooseAreaActivity活动

import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.app.ProgressDialog;import android.content.Intent;import android.content.SharedPreferences;import android.os.Bundle;import android.preference.PreferenceManager;import android.text.TextUtils;import android.view.View;import android.view.Window;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.ArrayAdapter;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;public class ChooseAreaActivity extends Activity {  public static final int LEVEL_PROVINCE = 0;public boolean isFromWeatherActivity;  public static final int LEVEL_CITY = 1;  public static final int LEVEL_COUNTY = 2;  private ProgressDialog progressDialog;  private TextView titleText;  private ListView listView;  private ArrayAdapter<String> adapter;  private CoolWeatherDB coolWeatherDB;  private List<String> dataList = new ArrayList<String>();  /**   * 省列表   */  private List<Province> provinceList;  /**   * 市列表   */  private List<City> cityList;  /**   * 县列表   */  private List<County> countyList;  /**   * 选中的省份   */  private Province selectedProvince;  private City selectedCity;  private int currentLevel;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    isFromWeatherActivity = getIntent().getBooleanExtra("from_weather_activity", false);    SharedPreferences prefs = PreferenceManager        .getDefaultSharedPreferences(this);    if (prefs.getBoolean("city_selected", false) && !isFromWeatherActivity) {      Intent intent = new Intent(this, WeatherActivity.class);      startActivity(intent);      finish();      return;    }    requestWindowFeature(Window.FEATURE_NO_TITLE);    setContentView(R.layout.choose_area);    listView = (ListView) findViewById(R.id.list_view);    titleText = (TextView) findViewById(R.id.title_text);    adapter = new ArrayAdapter<String>(this,        android.R.layout.simple_list_item_1, dataList);    listView.setAdapter(adapter);    coolWeatherDB = CoolWeatherDB.getInstance(this);    listView.setOnItemClickListener(new OnItemClickListener() {      @Override      public void onItemClick(AdapterView<?> arg0, View view, int index,          long arg3) {        if (currentLevel == LEVEL_PROVINCE) {          selectedProvince = provinceList.get(index);          queryCities();        } else if (currentLevel == LEVEL_CITY) {          selectedCity = cityList.get(index);          queryCounties();        } else if (currentLevel == LEVEL_COUNTY) {          String countyCode = countyList.get(index).getCountyCode();          Intent intent = new Intent(ChooseAreaActivity.this,              WeatherActivity.class);          intent.putExtra("county_code", countyCode);          startActivity(intent);          finish();        }      }    });    queryProvinces(); // 加载省级数据  }  /**   * 查询全国所有的省,优先从数据库查询,如果没有查询到再去服务器上查询。   */  private void queryProvinces() {    provinceList = coolWeatherDB.loadProvinces();    if (provinceList.size() > 0) {      dataList.clear();      for (Province province : provinceList) {        dataList.add(province.getProvinceName());      }      adapter.notifyDataSetChanged();      listView.setSelection(0);      titleText.setText("中国");      currentLevel = LEVEL_PROVINCE;    } else {      queryFromServer(null, "province");    }  }  /**   * 查询选中省内所有的市,优先从数据库查询,如果没有查询到再去服务器上查询。   */  private void queryCities() {    cityList = coolWeatherDB.loadCities(selectedProvince.getId());    if (cityList.size() > 0) {      dataList.clear();      for (City city : cityList) {        dataList.add(city.getCityName());      }      adapter.notifyDataSetChanged();      listView.setSelection(0);      titleText.setText(selectedProvince.getProvinceName());      currentLevel = LEVEL_CITY;    } else {      queryFromServer(selectedProvince.getProvinceCode(), "city");    }  }  /**   * 查询选中市内所有的县,优先从数据库查询,如果没有查询到再去服务器上查询。   */  private void queryCounties() {    countyList = coolWeatherDB.loadCounties(selectedCity.getId());    if (countyList.size() > 0) {      dataList.clear();      for (County county : countyList) {        dataList.add(county.getCountyName());      }      adapter.notifyDataSetChanged();      listView.setSelection(0);      titleText.setText(selectedCity.getCityName());      currentLevel = LEVEL_COUNTY;    } else {      queryFromServer(selectedCity.getCityCode(), "county");    }  }  /**   * 根据传入的代号和类型从服务器上查询省市县数据。 
   */  private void queryFromServer(final String code, final String type) {    String address;    if (!TextUtils.isEmpty(code)) {      address = "http://www.weather.com.cn/data/list3/city" + code          + ".;    } else {      address = "http://www.weather.com.cn/data/list3/city.;    }    showProgressDialog();    HttpUtil.sendHttpRequest(address, new HttpCallbackListener() {      @Override      public void onFinish(String response) {        boolean result = false;        if ("province".equals(type)) {          result = Utility.handleProvincesResponse(coolWeatherDB,              response);        } else if ("city".equals(type)) {          result = Utility.handleCitiesResponse(coolWeatherDB,              response, selectedProvince.getId());        } else if ("county".equals(type)) {          result = Utility.handleCountiesResponse(coolWeatherDB,              response, selectedCity.getId());        }        if (result) {          // 通过runOnUiThread()方法回到主线程处理逻辑          runOnUiThread(new Runnable() {            @Override            public void run() {              closeProgressDialog();              if ("province".equals(type)) {                queryProvinces();              } else if ("city".equals(type)) {                queryCities();              } else if ("county".equals(type)) {                queryCounties();              }            }          });        }      }      @Override      public void onError(Exception e) {        // 通过runOnUiThread()方法回到主线程处理逻辑        runOnUiThread(new Runnable() {          @Override          public void run() {            closeProgressDialog();            Toast.makeText(ChooseAreaActivity.this, "加载失败",                Toast.LENGTH_SHORT).show();          }        });      }    });  }  /**   * 显示进度对话框   */  private void showProgressDialog() {    if (progressDialog == null) {      progressDialog = new ProgressDialog(this);      progressDialog.setMessage("正在加载...");      progressDialog.setCanceledOnTouchOutside(false);    }    progressDialog.show();  }  /**   * 关闭进度对话框   */  private void closeProgressDialog() {    if (progressDialog != null) {      progressDialog.dismiss();    }  }  /**   * 捕获Back按键,根据当前的级别来判断,此时应该返回市列表、省列表、还是直接退出。   */  @Override  public void onBackPressed() {    if (currentLevel == LEVEL_COUNTY) {      queryCities();    } else if (currentLevel == LEVEL_CITY) {      queryProvinces();    } else {      if (isFromWeatherActivity) {        Intent intent = new Intent(this, WeatherActivity.class);        startActivity(intent);        }      finish();    }  }}