需要用到的插件依赖的架包
locSDK_4.0.jar用于定位 wae-for-debug.jar用于拼音排版
想要完整的项目链接res图片点击打开链接
先上效果图
想要完整的项目链接res图片点击打开链接
先上效果图
Splash启动页引导作用每次点击显示3秒,主界面定位你所选择的城市天气预报 ,显示多个天气预报多日期,Select查询SDKapi中的数据库
创建一个Weather类
package com.yuyanqing.iweather;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Timer;
import java.util.TimerTask;
import org.weixvn.wae.manager.EngineManager;
import com.yuyanqing.iweather.util.Utils;
import com.yuyanqing.iweather.web.UpdateWeather;
import android.app.Activity;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.graphics.Typeface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.format.Time;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;
import com.yuyanqing.Weather.R;
public class Weather extends Activity {
final private String DATE_KEY[] = { "date_0", "date_1", "date_2", "date_3" };
final private String WEATHER_KEY[] = { "weather_0", "weather_1",
"weather_2", "weather_3" };
final private String WIND_KEY[] = { "wind_0", "wind_1", "wind_2", "wind_3" };
final private String TEMPERATURE_KEY[] = { "temperature_0",
"temperature_1", "temperature_2", "temperature_3" };
public static Handler handler;
public static Weather context;
private String[] dateArray, weatherArray, windArray, temperatureArray;
private SharedPreferences sp;
private LinearLayout weatherBg;
private LinearLayout titleBarLayout;
private LinearLayout changeCity;
private TextView cityText;
private ImageView share;
private ImageView about;
private ImageView refresh;
private ProgressBar refreshing;
private TextView updateTimeText;
private ScrollView scrollView;
private LinearLayout currentWeatherLayout;
private ImageView weatherIcon;
private TextView currentTemperatureText;
private TextView currentWeatherText;
private TextView temperatureText;
private TextView windText;
private TextView dateText;
private ListView weatherForecastList;
private Intent intent;
private Time time;
private Runnable run;
private Builder builder;
private String currentWeekDay;
private String city;
private String currentTemperature;
private int index = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.weather);
EngineManager.getInstance().setContext(this.getApplicationContext())
.setDB(null);
weatherBg = (LinearLayout) findViewById(R.id.weather_bg);
titleBarLayout = (LinearLayout) findViewById(R.id.title_bar_layout);
changeCity = (LinearLayout) findViewById(R.id.change_city_layout);
cityText = (TextView) findViewById(R.id.city);
share = (ImageView) findViewById(R.id.share);
about = (ImageView) findViewById(R.id.about);
refresh = (ImageView) findViewById(R.id.refresh);
refreshing = (ProgressBar) findViewById(R.id.refreshing);
updateTimeText = (TextView) findViewById(R.id.update_time);
scrollView = (ScrollView) findViewById(R.id.scroll_view);
currentWeatherLayout = (LinearLayout) findViewById(R.id.current_weather_layout);
weatherIcon = (ImageView) findViewById(R.id.weather_icon);
currentTemperatureText = (TextView) findViewById(R.id.current_temperature);
currentWeatherText = (TextView) findViewById(R.id.current_weather);
temperatureText = (TextView) findViewById(R.id.temperature);
windText = (TextView) findViewById(R.id.wind);
dateText = (TextView) findViewById(R.id.date);
weatherForecastList = (ListView) findViewById(R.id.weather_forecast_list);
changeCity.setOnClickListener(new ButtonListener());
share.setOnClickListener(new ButtonListener());
about.setOnClickListener(new ButtonListener());
refresh.setOnClickListener(new ButtonListener());
Typeface face = Typeface.createFromAsset(getAssets(),
"fonts/HelveticaNeueLTPro-Lt.ttf");
currentTemperatureText.setTypeface(face);
setCurrentWeatherLayoutHight();
handler = new MyHandler();
context = this;
time = new Time();
run = new Runnable() {
@Override
public void run() {
refreshing(false);
Toast.makeText(Weather.this, "网络超时,请稍候再试", Toast.LENGTH_SHORT)
.show();
}
};
sp = getSharedPreferences("weather", Context.MODE_PRIVATE);
if ("".equals(sp.getString("city", ""))) {
intent = new Intent();
intent.setClass(Weather.this, SelectCity.class);
intent.putExtra("city", "");
Weather.this.startActivityForResult(intent, 100);
updateTimeText.setText("— — 更新");
weatherBg.setBackgroundResource(R.drawable.bg_na);
scrollView.setVisibility(View.GONE);
} else {
initData();
updateWeatherImage();
updateWeatherInfo();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == 1 && !data.getStringExtra("city").equals(city)) {
city = data.getStringExtra("city");
cityText.setText(city);
updateTimeText.setText("— — 更新");
weatherBg.setBackgroundResource(R.drawable.bg_na);
scrollView.setVisibility(View.GONE);
if (Utils.checkNetwork(Weather.this) == false) {
Toast.makeText(Weather.this, "网络异常,请检查网络设置", Toast.LENGTH_SHORT)
.show();
return;
}
updateWeather();
}
super.onActivityResult(requestCode, resultCode, data);
}
/**
* 主线程与更新天气的线程间通讯
*
* @author yuyanqing
*
*/
class MyHandler extends Handler {
@Override
public void handleMessage(Message msg) {
refreshing(false);
switch (msg.what) {
case 1:
handler.removeCallbacks(run);
Bundle bundle = msg.getData();
dateArray = bundle.getStringArray("date");
weatherArray = bundle.getStringArray("weather");
windArray = bundle.getStringArray("wind");
temperatureArray = bundle.getStringArray("temperature");
city = bundle.getString("city");
currentTemperature = bundle.getString("current_temperature");
saveData();
initData();
updateWeatherImage();
updateWeatherInfo();
break;
case 2:
builder = new Builder(Weather.this);
builder.setTitle("提示");
builder.setMessage("没有查询到[" + city + "]的天气信息。");
builder.setPositiveButton("重试",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
intent = new Intent();
intent.setClass(Weather.this, SelectCity.class);
Weather.this
.startActivityForResult(intent, 100);
}
});
builder.setNegativeButton("取消",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
finish();
}
});
builder.setCancelable(false);
builder.show();
break;
case 0:
Toast.makeText(Weather.this, "更新失败,请稍候再试", Toast.LENGTH_SHORT)
.show();
break;
default:
break;
}
super.handleMessage(msg);
}
}
/**
* 初始化数据
*/
private void initData() {
dateArray = new String[4];
weatherArray = new String[4];
windArray = new String[4];
temperatureArray = new String[4];
for (int i = 0; i < 4; i++) {
dateArray[i] = sp.getString(DATE_KEY[i], "");
weatherArray[i] = sp.getString(WEATHER_KEY[i], "");
windArray[i] = sp.getString(WIND_KEY[i], "");
temperatureArray[i] = sp.getString(TEMPERATURE_KEY[i], "");
}
city = sp.getString("city", "");
currentTemperature = sp.getString("current_temperature", "");
time.setToNow();
switch (time.weekDay) {
case 0:
currentWeekDay = "周日";
break;
case 1:
currentWeekDay = "周一";
break;
case 2:
currentWeekDay = "周二";
break;
case 3:
currentWeekDay = "周三";
break;
case 4:
currentWeekDay = "周四";
break;
case 5:
currentWeekDay = "周五";
break;
case 6:
currentWeekDay = "周六";
break;
default:
break;
}
for (int i = 0; i < 4; i++) {
if (dateArray[i].equals(currentWeekDay)) {
index = i;
}
}
}
/**
* 更新背景图片和天气图标
*/
private void updateWeatherImage() {
scrollView.setVisibility(View.VISIBLE);
String currentWeather = weatherArray[index];
if (currentWeather.contains("转")) {
currentWeather = currentWeather.substring(0,
currentWeather.indexOf("转"));
}
time.setToNow();
if (currentWeather.contains("晴")) {
if (time.hour >= 7 && time.hour < 19) {
weatherBg.setBackgroundResource(R.drawable.bg_fine_day);
weatherIcon.setImageResource(R.drawable.weather_img_fine_day);
} else {
weatherBg.setBackgroundResource(R.drawable.bg_fine_night);
weatherIcon.setImageResource(R.drawable.weather_img_fine_night);
}
} else if (currentWeather.contains("多云")) {
if (time.hour >= 7 && time.hour < 19) {
weatherBg.setBackgroundResource(R.drawable.bg_cloudy_day);
weatherIcon.setImageResource(R.drawable.weather_img_cloudy_day);
} else {
weatherBg.setBackgroundResource(R.drawable.bg_cloudy_night);
weatherIcon
.setImageResource(R.drawable.weather_img_cloudy_night);
}
} else if (currentWeather.contains("阴")) {
weatherBg.setBackgroundResource(R.drawable.bg_overcast);
weatherIcon.setImageResource(R.drawable.weather_img_overcast);
} else if (currentWeather.contains("雷")) {
weatherBg.setBackgroundResource(R.drawable.bg_thunder_storm);
weatherIcon.setImageResource(R.drawable.weather_img_thunder_storm);
} else if (currentWeather.contains("雨")) {
weatherBg.setBackgroundResource(R.drawable.bg_rain);
if (currentWeather.contains("小雨")) {
weatherIcon.setImageResource(R.drawable.weather_img_rain_small);
} else if (currentWeather.contains("中雨")) {
weatherIcon
.setImageResource(R.drawable.weather_img_rain_middle);
} else if (currentWeather.contains("大雨")) {
weatherIcon.setImageResource(R.drawable.weather_img_rain_big);
} else if (currentWeather.contains("暴雨")) {
weatherIcon.setImageResource(R.drawable.weather_img_rain_storm);
} else if (currentWeather.contains("雨夹雪")) {
weatherIcon.setImageResource(R.drawable.weather_img_rain_snow);
} else if (currentWeather.contains("冻雨")) {
weatherIcon.setImageResource(R.drawable.weather_img_sleet);
} else {
weatherIcon
.setImageResource(R.drawable.weather_img_rain_middle);
}
} else if (currentWeather.contains("雪")
|| currentWeather.contains("冰雹")) {
weatherBg.setBackgroundResource(R.drawable.bg_snow);
if (currentWeather.contains("小雪")) {
weatherIcon.setImageResource(R.drawable.weather_img_snow_small);
} else if (currentWeather.contains("中雪")) {
weatherIcon
.setImageResource(R.drawable.weather_img_snow_middle);
} else if (currentWeather.contains("大雪")) {
weatherIcon.setImageResource(R.drawable.weather_img_snow_big);
} else if (currentWeather.contains("暴雪")) {
weatherIcon.setImageResource(R.drawable.weather_img_snow_storm);
} else if (currentWeather.contains("冰雹")) {
weatherIcon.setImageResource(R.drawable.weather_img_hail);
} else {
weatherIcon
.setImageResource(R.drawable.weather_img_snow_middle);
}
} else if (currentWeather.contains("雾")) {
weatherBg.setBackgroundResource(R.drawable.bg_fog);
weatherIcon.setImageResource(R.drawable.weather_img_fog);
} else if (currentWeather.contains("霾")) {
weatherBg.setBackgroundResource(R.drawable.bg_haze);
weatherIcon.setImageResource(R.drawable.weather_img_fog);
} else if (currentWeather.contains("沙尘暴")
|| currentWeather.contains("浮尘")
|| currentWeather.contains("扬沙")) {
weatherBg.setBackgroundResource(R.drawable.bg_sand_storm);
weatherIcon.setImageResource(R.drawable.weather_img_sand_storm);
} else {
weatherBg.setBackgroundResource(R.drawable.bg_na);
weatherIcon.setImageResource(R.drawable.weather_img_fine_day);
}
}
/**
* 更新界面(天气信息)
*/
private void updateWeatherInfo() {
cityText.setText(city);
currentTemperatureText.setText(currentTemperature);
currentWeatherText.setText(weatherArray[index]);
temperatureText.setText(temperatureArray[index]);
windText.setText(windArray[index]);
Time time = new Time();
time.setToNow();
String date = new SimpleDateFormat("MM/dd").format(new Date());
dateText.setText(currentWeekDay + " " + date);
String updateTime = sp.getString("update_time", "");
if (Integer.parseInt(updateTime.substring(0, 4)) == time.year
&& Integer.parseInt(updateTime.substring(5, 7)) == time.month + 1
&& Integer.parseInt(updateTime.substring(8, 10)) == time.monthDay) {
updateTime = "今天" + updateTime.substring(updateTime.indexOf(" "));
updateTimeText.setTextColor(getResources().getColor(R.color.white));
} else {
updateTime = updateTime.substring(5).replace("-", "月")
.replace(" ", "日 ");
updateTimeText.setTextColor(getResources().getColor(R.color.red));
// 超过一天没有更新天气,自动帮用户更新
if (Utils.checkNetwork(Weather.this) == true) {
updateWeather();
}
}
updateTimeText.setText(updateTime + " 更新");
weatherForecastList.setAdapter(new MyAdapter(Weather.this));
Utils.setListViewHeightBasedOnChildren(weatherForecastList);
}
/**
* 设置布局的高度(铺满屏幕)
*/
private void setCurrentWeatherLayoutHight() {
// 通知栏高度
int statusBarHeight = 0;
try {
statusBarHeight = getResources().getDimensionPixelSize(
Integer.parseInt(Class
.forName("com.android.internal.R$dimen")
.getField("status_bar_height")
.get(Class.forName("com.android.internal.R$dimen")
.newInstance()).toString()));
} catch (Exception e1) {
e1.printStackTrace();
}
// 屏幕高度
int displayHeight = ((WindowManager) this
.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay()
.getHeight();
// title bar LinearLayout高度
titleBarLayout.measure(View.MeasureSpec.makeMeasureSpec(0,
View.MeasureSpec.UNSPECIFIED), View.MeasureSpec
.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
int titleBarHeight = titleBarLayout.getMeasuredHeight();
LayoutParams linearParams = (LayoutParams) currentWeatherLayout
.getLayoutParams();
linearParams.height = displayHeight - statusBarHeight - titleBarHeight;
currentWeatherLayout.setLayoutParams(linearParams);
}
/**
* 更新天气
*/
private void updateWeather() {
refreshing(true);
handler.postDelayed(run, 60 * 1000);
EngineManager.getInstance().getWebPageMannger()
.getWebPage(UpdateWeather.class).setHtmlValue("city", city);
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
EngineManager.getInstance().getWebPageMannger()
.updateWebPage(UpdateWeather.class, true);
}
});
thread.start();
}
/**
* 保存天气信息
*/
private void saveData() {
String updateTime = new SimpleDateFormat("yyyy-MM-dd")
.format(new Date());
Time time = new Time();
time.setToNow();
String hour, minute;
hour = time.hour + "";
minute = time.minute + "";
if (hour.length() < 2) {
hour = "0" + hour;
}
if (minute.length() < 2) {
minute = "0" + minute;
}
updateTime = updateTime + " " + hour + ":" + minute;
Editor editor = sp.edit();
editor.putString("update_time", updateTime);
for (int i = 0; i < 4; i++) {
editor.putString(DATE_KEY[i], dateArray[i]);
editor.putString(WEATHER_KEY[i], weatherArray[i]);
editor.putString(WIND_KEY[i], windArray[i]);
editor.putString(TEMPERATURE_KEY[i], temperatureArray[i]);
}
editor.putString("city", city);
editor.putString("current_temperature", currentTemperature);
editor.commit();
}
/**
* 刷新时显示进度条
*
* @param isRefreshing
* 是否正在刷新
*/
private void refreshing(boolean isRefreshing) {
if (isRefreshing) {
refresh.setVisibility(View.GONE);
refreshing.setVisibility(View.VISIBLE);
} else {
refresh.setVisibility(View.VISIBLE);
refreshing.setVisibility(View.GONE);
}
}
class MyAdapter extends BaseAdapter {
private Context mContext;
private MyAdapter(Context mContext) {
this.mContext = mContext;
}
@Override
public int getCount() {
return getData().size();
}
@Override
public Object getItem(int arg0) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(mContext).inflate(
R.layout.weather_forecast_item, null);
holder = new ViewHolder();
holder.date = (TextView) convertView
.findViewById(R.id.weather_forecast_date);
holder.img = (ImageView) convertView
.findViewById(R.id.weather_forecast_img);
holder.weather = (TextView) convertView
.findViewById(R.id.weather_forecast_weather);
holder.temperature = (TextView) convertView
.findViewById(R.id.weather_forecast_temperature);
holder.wind = (TextView) convertView
.findViewById(R.id.weather_forecast_wind);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
Typeface face = Typeface.createFromAsset(getAssets(),
"fonts/fangzhenglantingxianhe_GBK.ttf");
holder.date.setText(getData().get(position).get("date").toString());
holder.img.setImageResource((Integer) getData().get(position).get(
"img"));
holder.weather.setText(getData().get(position).get("weather")
.toString());
holder.temperature.setText(getData().get(position)
.get("temperature").toString());
holder.temperature.setTypeface(face);
holder.wind.setText(getData().get(position).get("wind").toString());
return convertView;
}
}
class ViewHolder {
TextView date;
ImageView img;
TextView weather;
TextView temperature;
TextView wind;
}
/**
* 获取天气预报信息
*
* @return 天气预报list
*/
private ArrayList<HashMap<String, Object>> getData() {
ArrayList<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();
for (int i = 0; i < 4; i++) {
HashMap<String, Object> map = new HashMap<String, Object>();
if (dateArray[i].equals(currentWeekDay)) {
map.put("date", "今天");
} else {
map.put("date", dateArray[i]);
}
map.put("img", getWeatherImg(weatherArray[i]));
map.put("weather", weatherArray[i]);
map.put("temperature", temperatureArray[i]);
map.put("wind", windArray[i]);
list.add(map);
}
return list;
}
/**
* 根据天气信息设置天气图片
*
* @param weather
* 天气信息
* @return 对应的天气图片id
*/
private int getWeatherImg(String weather) {
int img = 0;
if (weather.contains("转")) {
weather = weather.substring(0, weather.indexOf("转"));
}
if (weather.contains("晴")) {
img = R.drawable.weather_icon_fine;
} else if (weather.contains("多云")) {
img = R.drawable.weather_icon_cloudy;
} else if (weather.contains("阴")) {
img = R.drawable.weather_icon_overcast;
} else if (weather.contains("雷")) {
img = R.drawable.weather_icon_thunder_storm;
} else if (weather.contains("小雨")) {
img = R.drawable.weather_icon_rain_small;
} else if (weather.contains("中雨")) {
img = R.drawable.weather_icon_rain_middle;
} else if (weather.contains("大雨")) {
img = R.drawable.weather_icon_rain_big;
} else if (weather.contains("暴雨")) {
img = R.drawable.weather_icon_rain_storm;
} else if (weather.contains("雨夹雪")) {
img = R.drawable.weather_icon_rain_snow;
} else if (weather.contains("冻雨")) {
img = R.drawable.weather_icon_sleet;
} else if (weather.contains("小雪")) {
img = R.drawable.weather_icon_snow_small;
} else if (weather.contains("中雪")) {
img = R.drawable.weather_icon_snow_middle;
} else if (weather.contains("大雪")) {
img = R.drawable.weather_icon_snow_big;
} else if (weather.contains("暴雪")) {
img = R.drawable.weather_icon_snow_storm;
} else if (weather.contains("冰雹")) {
img = R.drawable.weather_icon_hail;
} else if (weather.contains("雾") || weather.contains("霾")) {
img = R.drawable.weather_icon_fog;
} else if (weather.contains("沙尘暴") || weather.contains("浮尘")
|| weather.contains("扬沙")) {
img = R.drawable.weather_icon_sand_storm;
} else {
img = R.drawable.weather_icon_fine;
}
return img;
}
class ButtonListener implements OnClickListener {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.change_city_layout:
intent = new Intent();
intent.setClass(Weather.this, SelectCity.class);
Weather.this.startActivityForResult(intent, 100);
break;
case R.id.share:
intent = new Intent(Intent.ACTION_SEND);
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_SUBJECT, "好友分享");
intent.putExtra(Intent.EXTRA_TEXT,
"我正在使用iWeather,可以随时随地查看天气信息,是您出差、旅行的贴心助手!推荐你也试试~,在360手机助手就可以下载。");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Weather.this
.startActivity(Intent.createChooser(intent, "好友分享"));
break;
case R.id.about:
LayoutInflater inflater = getLayoutInflater();
View dialogLayout = inflater.inflate(R.layout.weather_dialog,
(ViewGroup) findViewById(R.layout.weather_dialog));
TextView version = (TextView) dialogLayout
.findViewById(R.id.version);
version.setText("V " + Utils.getVersion(Weather.this));
builder = new Builder(Weather.this);
builder.setTitle("关于");
builder.setView(dialogLayout);
builder.setPositiveButton("确定", null);
builder.setCancelable(false);
builder.show();
break;
case R.id.refresh:
if (Utils.checkNetwork(Weather.this) == false) {
Toast.makeText(Weather.this, "网络异常,请检查网络设置",
Toast.LENGTH_SHORT).show();
return;
}
updateWeather();
break;
default:
break;
}
}
}
/**
* 菜单、返回键响应
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
exitBy2Click();
}
return false;
}
/**
* 双击退出函数
*/
private static Boolean isExit = false;
private void exitBy2Click() {
Timer timer = null;
if (isExit == false) {
isExit = true;
Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show();
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
isExit = false;
}
}, 2000);
} else {
finish();
System.exit(0);
}
}
}
创建一个Uitl类用于连接OKhttp检测有没有Intent连接Af
package com.yuyanqing.iweather.util;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListAdapter;
import android.widget.ListView;
/**
* @author yuyanqing
*
*/
public class Utils {
/**
* 检查网络连接
*
* @param context
* context
* @return 是否连接到网络
*/
public static boolean checkNetwork(Context context) {
ConnectivityManager connectivity = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity != null) {
NetworkInfo info = connectivity.getActiveNetworkInfo();
if (info != null && info.isConnected()) {
if (info.getState() == NetworkInfo.State.CONNECTED) {
return true;
}
}
}
return false;
}
/**
* 获取版本号
*
* @param context
* context
* @return 版本号
*/
public static String getVersion(Context context) {
PackageManager manager = context.getPackageManager();
PackageInfo info = null;
try {
info = manager.getPackageInfo(context.getPackageName(), 0);
} catch (NameNotFoundException e) {
e.printStackTrace();
}
return info.versionName;
}
/**
* 设置ListView高度
*
* @param listView
* 要设置高度的ListView
*/
public static void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
return;
}
int totalHeight = 0;
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight
+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}
}
创建一个启动页引导页
package com.yuyanqing.iweather;
import com.yuyanqing.Weather.R;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.view.Window;
public class Welcome extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.welcome);
Runnable run = new Runnable() {
@Override
public void run() {
Intent intent = new Intent();
intent.setClass(Welcome.this, Weather.class);
Welcome.this.startActivity(intent);
Welcome.this.finish();
}
};
Handler handler = new Handler();
handler.postDelayed(run, 1 * 1000);
}
}
Select查询类
package com.yuyanqing.iweather;
import android.app.Activity;
import android.app.AlertDialog.Builder;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.yuyanqing.iweather.util.Utils;
import com.yuyanqing.Weather.R;
public class SelectCity extends Activity {
private String[] citys;
private ImageView back;
private GridView cityList;
private Intent intent;
private EditText inputCity;
private Button search;
private ProgressDialog dialog;
private Builder builder;
private String city;
public LocationClient mLocationClient = null;
public BDLocationListener myListener = new MyLocationListener();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.select_city);
// 声明LocationClient类
mLocationClient = new LocationClient(getApplicationContext());
// 注册监听函数
mLocationClient.registerLocationListener(myListener);
// 设置定位参数
setLocationOption();
dialog = new ProgressDialog(SelectCity.this);
dialog.setMessage("正在定位...");
dialog.setCanceledOnTouchOutside(false);
citys = getResources().getStringArray(R.array.citys);
cityList = (GridView) findViewById(R.id.city_list);
back = (ImageView) findViewById(R.id.back);
inputCity = (EditText) findViewById(R.id.input_city);
search = (Button) findViewById(R.id.search);
back.setOnClickListener(new ButtonListener());
search.setOnClickListener(new ButtonListener());
inputCity.addTextChangedListener(new Watcher());
cityList.setAdapter(new MyAdapter(SelectCity.this));
cityList.setOnItemClickListener(new ClickListener());
}
class MyAdapter extends BaseAdapter {
private Context mContext;
private MyAdapter(Context mContext) {
this.mContext = mContext;
}
@Override
public int getCount() {
return citys.length;
}
@Override
public Object getItem(int arg0) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(mContext).inflate(
R.layout.city_item, null);
holder = new ViewHolder();
holder.city = (TextView) convertView.findViewById(R.id.city);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.city.setText(citys[position]);
return convertView;
}
}
class ViewHolder {
TextView city;
}
class ClickListener implements OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
city = citys[arg2];
if ("自动定位".equals(city)) {
if (Utils.checkNetwork(SelectCity.this) == false) {
Toast.makeText(SelectCity.this, "网络异常,请检查网络设置",
Toast.LENGTH_SHORT).show();
return;
}
dialog.show();
requestLocation();
} else {
intent = new Intent();
intent.putExtra("city", city);
SelectCity.this.setResult(1, intent);
SelectCity.this.finish();
}
}
}
/**
* 监听编辑框内容,输入内容,显示搜索按键
*/
class Watcher implements TextWatcher {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
if (inputCity.getText().toString().length() == 0) {
search.setVisibility(View.GONE);
} else {
search.setVisibility(View.VISIBLE);
}
}
}
class ButtonListener implements OnClickListener {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.back:
back();
break;
case R.id.search:
city = inputCity.getText().toString();
intent = new Intent();
intent.putExtra("city", city);
SelectCity.this.setResult(1, intent);
SelectCity.this.finish();
break;
default:
break;
}
}
}
/**
* 实现BDLocationListener接口
*
* BDLocationListener接口有2个方法需要实现: 1.接收异步返回的定位结果,参数是BDLocation类型参数。
* 2.接收异步返回的POI查询结果,参数是BDLocation类型参数。
*
* @author 晨彦
*
*/
class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
if (location == null)
return;
// StringBuffer sb = new StringBuffer(256);
// sb.append("time : ");
// sb.append(location.getTime());
// sb.append("\nerror code : ");
// sb.append(location.getLocType());
// sb.append("\nlatitude : ");
// sb.append(location.getLatitude());
// sb.append("\nlontitude : ");
// sb.append(location.getLongitude());
// sb.append("\nradius : ");
// sb.append(location.getRadius());
// if (location.getLocType() == BDLocation.TypeGpsLocation) {
// sb.append("\nspeed : ");
// sb.append(location.getSpeed());
// sb.append("\nsatellite : ");
// sb.append(location.getSatelliteNumber());
// } else if (location.getLocType() ==
// BDLocation.TypeNetWorkLocation) {
// sb.append("\naddr : ");
// sb.append(location.getAddrStr());
// }
dialog.cancel();
int code = location.getLocType();
String addr = location.getAddrStr();
if (code == 161 && addr != null) {
// 定位成功
System.out.println(addr);
city = formatCity(addr);
intent = new Intent();
intent.putExtra("city", city);
SelectCity.this.setResult(1, intent);
SelectCity.this.finish();
} else {
// 定位失败
builder = new Builder(SelectCity.this);
builder.setTitle("提示");
builder.setMessage("自动定位失败。");
builder.setPositiveButton("重试",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
if (Utils.checkNetwork(SelectCity.this) == false) {
Toast.makeText(SelectCity.this,
"网络异常,请检查网络设置", Toast.LENGTH_SHORT)
.show();
return;
}
SelectCity.this.dialog.show();
requestLocation();
}
});
builder.setNegativeButton("取消", null);
builder.setCancelable(false);
builder.show();
}
}
@Override
public void onReceivePoi(BDLocation poiLocation) {
}
}
/**
* 设置定位参数。 定位模式(单次定位,定时定位),返回坐标类型,是否打开GPS等等。
*/
private void setLocationOption() {
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true);
option.setAddrType("all");// 返回的定位结果包含地址信息
option.setCoorType("bd09ll");// 返回的定位结果是百度经纬度,默认值gcj02
option.setScanSpan(24 * 60 * 60 * 1000);// 设置发起定位请求的间隔时间为5000ms
option.disableCache(true);// 禁止启用缓存定位
option.setPoiNumber(5); // 最多返回POI个数
option.setPoiDistance(1000); // poi查询距离
option.setPoiExtraInfo(true); // 是否需要POI的电话和地址等详细信息
mLocationClient.setLocOption(option);
}
/**
* 请求位置信息
*/
private void requestLocation() {
if (mLocationClient.isStarted() == false) {
mLocationClient.start();
} else {
mLocationClient.requestLocation();
}
}
/**
* 将位置信息转换为城市
*
* @param addr
* 位置
* @return 城市名称
*/
private String formatCity(String addr) {
String city = null;
if (addr.contains("北京市") && addr.contains("区")) {
city = addr.substring(addr.indexOf("市") + 1, addr.indexOf("区"));
} else if (addr.contains("县")) {
city = addr.substring(addr.indexOf("市") + 1, addr.indexOf("县"));
} else {
int start = addr.indexOf("市");
int end = addr.lastIndexOf("市");
if (start == end) {
if (addr.contains("省")) {
city = addr.substring(addr.indexOf("省") + 1,
addr.indexOf("市"));
} else if (addr.contains("市")) {
city = addr.substring(0, addr.indexOf("市"));
}
} else {
city = addr.substring(addr.indexOf("市") + 1,
addr.lastIndexOf("市"));
}
}
return city;
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
back();
return true;
}
return super.onKeyDown(keyCode, event);
}
/**
* finish Activity前判断是否结束主Activity
*/
private void back() {
intent = getIntent();
if ("".equals(intent.getStringExtra("city"))) {
Weather.context.finish();
}
SelectCity.this.finish();
System.exit(0);
}
}
OkHttp接口类
/**
* 新浪天气接口,由于太麻烦,写了一半就放弃了
*/
package com.yuyanqing.iweather.web;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import org.jsoup.nodes.Document;
import org.weixvn.wae.webpage.WebPage;
import com.yuyanqing.iweather.Weather;
import android.os.Bundle;
import android.os.Message;
public class SinaWeather extends WebPage {
@Override
public void onStart() {
String city = null;
try {
city = URLEncoder.encode("长沙", "gb2312");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
this.uri = "http://php.weather.sina.com.cn/xml.php?city=" + city
+ "&password=......=0";
this.type = RequestType.GET;
}
@Override
public void onSuccess(Document doc) {
analyze(doc);
}
private void analyze(Document doc) {
Message msg = Weather.handler.obtainMessage();
if (doc.toString().contains("weather")) {
// 查询成功
msg.what = 0;
Bundle bundle = new Bundle();
int start = doc.toString().indexOf("at") + 3;
// 更新时间
bundle.putString("update_time",
doc.toString().substring(start, start + 19));
// 城市
bundle.putString("city", doc.getElementsByTag("city").get(0).text());
String status1 = doc.getElementsByTag("status1").get(0).text();
String status2 = doc.getElementsByTag("status2").get(0).text();
if (!status1.equals(status2) && !"".equals(status2)) {
status1 = status1 + "转" + status2;
}
// 天气情况
bundle.putString("weather", status1);
String windDirection = doc.getElementsByTag("direction1").get(0)
.text();
if ("无持续风向".equals(windDirection)) {
windDirection = "";
}
// 风向
bundle.putString("wind_direction", windDirection);
String windPower = doc.getElementsByTag("power1").get(0).text();
if ("≤3".equals(windPower)) {
windPower = "微风";
}
// 风级
bundle.putString("power", windPower);
// 高温
bundle.putString("high_temperature",
doc.getElementsByTag("temperature1").get(0).text());
// 低温
bundle.putString("low_temperature",
doc.getElementsByTag("temperature2").get(0).text());
// 体感温度
bundle.putString("tgd", doc.getElementsByTag("tgd1").get(0).text());
// 穿衣指数说明
bundle.putString("chy_s",
doc.getElementsByTag("chy_shuoming").get(0).text());
// 污染指数
bundle.putString("pollution_l", doc.getElementsByTag("pollution_l")
.get(0).text());
// 紫外线指
bundle.putString("zwx_l", doc.getElementsByTag("zwx_l").get(0)
.text());
// 舒适度
bundle.putString("ssd_l", doc.getElementsByTag("ssd_l").get(0)
.text());
}
}
}
API接口类
package com.yuyanqing.iweather.web;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.weixvn.wae.webpage.WebPage;
import com.yuyanqing.iweather.Weather;
import android.os.Bundle;
import android.os.Message;
/**
* @author yuyanqing
*
*/
public class UpdateWeather extends WebPage {
@Override
public void onStart() {
String city = getHtmlValue("city");
// 这里的AK替换成自己申请的百度API KEY,申请地址http://lbsyun.baidu.com/apiconsole/key
final String ak = ".......";
this.uri = "http://api.map.baidu.com/telematics/v3/weather";
this.type = RequestType.GET;
this.params = getParams();
params.put("location", city);
params.put("ak", ak);
}
@Override
public void onSuccess(Document doc) {
analyze(doc);
}
private void analyze(Document doc) {
Message msg = Weather.handler.obtainMessage();
String status = doc.getElementsByTag("status").get(0).text();
if ("success".equals(status)) {
// 查询成功
msg.what = 1;
String city = doc.getElementsByTag("currentcity").get(0).text();
Element weatherDataElem = doc.getElementsByTag("weather_data").get(
0);
Elements dateElem = weatherDataElem.getElementsByTag("date");
Elements weatherElem = weatherDataElem.getElementsByTag("weather");
Elements windElem = weatherDataElem.getElementsByTag("wind");
Elements temperatureElem = weatherDataElem
.getElementsByTag("temperature");
String[] dateArray = new String[4];
String[] weatherArray = new String[4];
String[] windArray = new String[4];
String[] temperatureArray = new String[4];
String currentTemperature = null;
for (int i = 0; i < 4; i++) {
String date = dateElem.get(i).text();
if (i == 0) {
if (date.contains("实时")) {
currentTemperature = date.substring(
date.indexOf(":") + 1, date.indexOf("℃")) + "°";
}
date = date.substring(0, 2);
}
dateArray[i] = date;
weatherArray[i] = weatherElem.get(i).text();
windArray[i] = windElem.get(i).text();
String temperature = temperatureElem.get(i).text();
if (temperature.contains("~")) {
String highTem = temperature.substring(0,
temperature.indexOf(" "));
String lowTem = temperature.substring(
temperature.lastIndexOf(" ") + 1,
temperature.indexOf("℃"));
temperature = lowTem + "~" + highTem + "°";
} else {
temperature = temperature.replace("℃", "°");
}
temperatureArray[i] = temperature;
}
if (currentTemperature == null) {
currentTemperature = temperatureArray[0];
}
Bundle bundle = new Bundle();
bundle.putStringArray("date", dateArray);
bundle.putStringArray("weather", weatherArray);
bundle.putStringArray("wind", windArray);
bundle.putStringArray("temperature", temperatureArray);
bundle.putString("city", city);
bundle.putString("current_temperature", currentTemperature);
msg.setData(bundle);
} else if ("No result available".equals(status)) {
// 没有天气信息
msg.what = 2;
} else {
// 其他错误
msg.what = 0;
}
Weather.handler.sendMessage(msg);
}
}
下面是对应的XML
city_item.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="40dp"
android:background="@drawable/city_pressed_effect"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp" >
<TextView
android:id="@+id/city"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:textColor="@color/white"
android:textSize="18sp" />
</LinearLayout>
</LinearLayout>
select_city.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/select_city_bg_default"
tools:context=".SelectCity" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/select_city_bg_cover"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="45dp"
android:background="@drawable/title_bar_bg"
android:orientation="horizontal" >
<ImageView
android:id="@+id/back"
android:layout_width="45dp"
android:layout_height="45dp"
android:background="@drawable/title_bar_image_pressed_effect"
android:padding="14dp"
android:scaleType="centerInside"
android:src="@drawable/title_bar_back" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="5dp"
android:text="选择城市"
android:textColor="@color/white"
android:textSize="20sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="10dp"
android:orientation="vertical" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<EditText
android:id="@+id/input_city"
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="@drawable/search_input_bg"
android:hint="请输入城市名称"
android:paddingLeft="20dp"
android:textColor="@color/white"
android:textCursorDrawable="@null"
android:textSize="16sp" />
<Button
android:id="@+id/search"
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="20dp"
android:background="@drawable/icon_search"
android:visibility="gone" />
</RelativeLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="热门城市"
android:textColor="@color/light_grey"
android:textSize="15sp" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginTop="5dp"
android:background="@drawable/trend_bg_line" />
<GridView
android:id="@+id/city_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:listSelector="@color/transparent"
android:numColumns="3"
android:paddingBottom="5dp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
weather_dialog.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="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="10dp"
android:text="@string/app_name"
android:textColor="@color/white"
android:textSize="20sp" />
<TextView
android:id="@+id/version"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="V 1.0.0"
android:textColor="@color/light_grey"
android:textSize="18sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="10dp"
android:layout_marginTop="10dp"
android:gravity="center_horizontal"
android:text="Copyright © 2018yuyanqing\nAll Right Reserved."
android:textColor="@color/light_grey"
android:textSize="16sp" />
</LinearLayout>
weather_forecast_item.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="55dp" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="55dp"
android:orientation="horizontal" >
<TextView
android:id="@+id/weather_forecast_date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="5dp"
android:textColor="@color/light_grey"
android:textSize="14sp" />
<ImageView
android:id="@+id/weather_forecast_img"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_gravity="center_vertical"
android:layout_marginLeft="10dp"
android:scaleType="centerInside" />
<TextView
android:id="@+id/weather_forecast_weather"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="5dp"
android:layout_weight="1"
android:gravity="left"
android:maxLines="2"
android:textColor="@color/white"
android:textSize="14sp" />
<TextView
android:id="@+id/weather_forecast_temperature"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:gravity="center"
android:textColor="@color/white"
android:textSize="15sp" />
<TextView
android:id="@+id/weather_forecast_wind"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:gravity="right"
android:singleLine="true"
android:textColor="@color/white"
android:textSize="14sp" />
</LinearLayout>
</LinearLayout>
weather.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/weather_bg"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg_fine_day"
android:orientation="vertical"
tools:context=".Weather" >
<LinearLayout
android:id="@+id/title_bar_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="45dp" >
<LinearLayout
android:id="@+id/change_city_layout"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_centerVertical="true"
android:background="@drawable/title_bar_image_pressed_effect"
android:orientation="horizontal" >
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="10dp"
android:src="@drawable/locate_indicator" />
<TextView
android:id="@+id/city"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:textColor="@color/white"
android:textSize="20sp" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:orientation="horizontal" >
<ImageView
android:id="@+id/share"
android:layout_width="45dp"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:background="@drawable/title_bar_image_pressed_effect"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:scaleType="centerInside"
android:src="@drawable/title_bar_shared" />
<View
android:layout_width="1dp"
android:layout_height="20dp"
android:layout_gravity="center_vertical"
android:layout_marginLeft="1px"
android:layout_marginRight="1px"
android:background="@drawable/trend_bg_line" />
<ImageView
android:id="@+id/about"
android:layout_width="45dp"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:background="@drawable/title_bar_image_pressed_effect"
android:paddingLeft="12.5dp"
android:paddingRight="12.5dp"
android:scaleType="centerInside"
android:src="@drawable/title_bar_about" />
<View
android:layout_width="1dp"
android:layout_height="20dp"
android:layout_gravity="center_vertical"
android:layout_marginLeft="1px"
android:layout_marginRight="1px"
android:background="@drawable/trend_bg_line" />
<RelativeLayout
android:layout_width="45dp"
android:layout_height="match_parent" >
<ImageView
android:id="@+id/refresh"
android:layout_width="45dp"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:background="@drawable/title_bar_image_pressed_effect"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:scaleType="centerInside"
android:src="@drawable/title_bar_refresh" />
<ProgressBar
android:id="@+id/refreshing"
android:layout_width="22dp"
android:layout_height="22dp"
android:layout_centerInParent="true"
android:visibility="gone" />
</RelativeLayout>
</LinearLayout>
</RelativeLayout>
<TextView
android:id="@+id/update_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:layout_marginBottom="10dp"
android:layout_marginRight="10dp"
android:textColor="@color/white"
android:textSize="12sp" />
</LinearLayout>
<ScrollView
android:id="@+id/scroll_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="none" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/current_weather_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:id="@+id/weather_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_marginRight="20dp"
android:layout_marginTop="20dp"
android:scaleType="centerInside" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:orientation="vertical" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp" >
<TextView
android:id="@+id/current_temperature"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:textColor="@color/white"
android:textSize="80sp" />
<TextView
android:id="@+id/current_weather"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@id/current_temperature"
android:layout_toRightOf="@id/current_temperature"
android:singleLine="true"
android:textColor="@color/white"
android:textSize="30sp" />
</RelativeLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="5dp"
android:background="@drawable/trend_bg_line" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="5dp"
android:orientation="horizontal" >
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:orientation="horizontal" >
<ImageView
android:layout_width="14dp"
android:layout_height="14dp"
android:layout_gravity="center_vertical"
android:scaleType="centerInside"
android:src="@drawable/temperature_small_img" />
<TextView
android:id="@+id/temperature"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:textColor="@color/white"
android:textSize="15sp" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:gravity="center"
android:orientation="horizontal" >
<ImageView
android:layout_width="14dp"
android:layout_height="14dp"
android:layout_gravity="center_vertical"
android:scaleType="centerInside"
android:src="@drawable/wind_samll_img" />
<TextView
android:id="@+id/wind"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:textColor="@color/white"
android:textSize="15sp" />
</LinearLayout>
<TextView
android:id="@+id/date"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:gravity="right"
android:textColor="@color/white"
android:textSize="15sp" />
</LinearLayout>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="5dp"
android:layout_marginTop="5dp"
android:src="@drawable/today_weather_extra_arrow" />
</LinearLayout>
</RelativeLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:layout_marginTop="5dp"
android:background="@drawable/weather_forcast_bg"
android:orientation="vertical" >
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dp" >
<ImageView
android:id="@+id/weather_forecast_icon"
android:layout_width="25dp"
android:layout_height="22dp"
android:layout_marginBottom="2dp"
android:layout_marginLeft="5dp"
android:layout_marginTop="2dp"
android:scaleType="centerInside"
android:src="@drawable/weather_forecast_icon" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="5dp"
android:layout_toRightOf="@id/weather_forecast_icon"
android:text="天气预报"
android:textColor="@color/white"
android:textSize="14sp" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="15dp"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="5dp"
android:scaleType="centerInside"
android:src="@drawable/drag_view_handle" />
</RelativeLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:background="@drawable/trend_bg_line" />
<ListView
android:id="@+id/weather_forecast_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:divider="@drawable/trend_bg_line"
android:dividerHeight="1dp"
android:listSelector="@color/transparent" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:background="@drawable/trend_bg_line" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_margin="10dp"
android:layout_marginLeft="5dp"
android:text="天气预报由百度天气提供"
android:textColor="@color/light_grey"
android:textSize="14sp" />
</LinearLayout>
</LinearLayout>
</ScrollView>
</LinearLayout>
welcome.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/welcome_bg"
android:orientation="vertical"
tools:context=".Welcome" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="15dp"
android:text="@string/app_name"
android:textColor="@color/white"
android:textSize="25sp" />
</LinearLayout>
AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 百度定位需要的权限 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.READ_LOGS" />
Manifest启动项
<application
android:allowBackup="true"
android:icon="@drawable/icon"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" >
</service>
<activity
android:name="com.yuyanqing.iweather.Welcome"
android:label="@string/app_name"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.yuyanqing.iweather.Weather"
android:label="@string/app_name" >
</activity>
<activity
android:name="com.yuyanqing.iweather.SelectCity"
android:label="@string/app_name" >
</activity>
</application>
</manifest>
以上便是MINI天气预报的总体项目需要图片源代码的去我的资源下载
点击打开链接