Android#17 -- MyDay App (3)
2017-10-24 本文已影响0人
喜欢书的女孩
[1]功能模块的完善
- 实现多个城市的气温查询
- 实现天气与穿搭的关联
- 实现获取实时时间,显示对应的日程任务
[2] 效果图
1.jpg
2.jpg
3.jpg
[3] 显示代码
- 多个城市的气温查询
[1]xml
<Spinner
android:id="@+id/sp_adress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignEnd="@+id/btn_address"
android:layout_below="@+id/tv_temp"
android:layout_marginEnd="11dp"
android:layout_marginTop="39dp"
android:entries="@array/languages"
android:textColor="@color/colorPrimary"
android:textSize="24sp" />
[2] arrays
<resources>
<string-array name="languages">
<item>广州</item>
<item>上海 </item>
<item>北京</item>
<item>哈尔滨</item>
<item>拉萨</item>
</string-array>
</resources>
[3] activity
private Spinner sp_adress;
sp_adress.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
//选择城市
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
String[] languages = getResources().getStringArray(R.array.languages);
adress = languages[position];
doGet();
initView();
}
//默认广州
@Override
public void onNothingSelected(AdapterView<?> parent) {
adress = "广州";
doGet();
initView();
}
});
/**
* 子线程
* @return
*/
private boolean doGet(){
new Thread(new Runnable() {
@Override
public void run() {
try {
getWeather();
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
return false;
}
/**
* 获取服务器数据
*/
public void getWeather(){
RequestQueue queue = Volley.newRequestQueue(getActivity());
StringRequest request = new StringRequest(Request.Method.POST, "http://route.showapi.com/9-2", new Response.Listener<String>() {
@Override
public void onResponse(String s) {
Log.e("TAG", "onResponse: "+ s );
jsonParser(s);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("TAG", "onErrorResponse: 错误" +error.toString());
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> map = new HashMap();
map.put("showapi_appid","48138");
map.put("showapi_sign","ede742069d024875a86520572b742c17");
map.put("area", adress);
return map;
}
};
queue.add(request);
}
//解析数据
private void jsonParser(String jsonData) {
try {
JSONObject jsonObject = new JSONObject(jsonData);
JSONObject body = jsonObject.getJSONObject("showapi_res_body");
// time=body.getString("time");
// Log.i(TAG,"时间"+time);
JSONObject now = body.getJSONObject("now");
weather=now.optString("weather","defaultValue");
temperature=now.optString("temperature","defaultValue");
wind_power=now.optString("wind_power","defaultValue");
temperature_time = now.optString("temperature_time","defaultValue");
Log.i(TAG,"天气"+weather);
Log.i(TAG,"温度"+temperature);
Log.i(TAG,"风力"+wind_power);
Log.i(TAG,"时刻"+temperature_time);
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
//更新UI
tv_weather.setText(weather);
tv_temp.setText(temperature);
tv_wind.setText(wind_power);
et_time.setText(time);
}
});
saveSelectData(temperature);
} catch (JSONException e) {
e.printStackTrace();
}
}
//保存数据
private void saveSelectData(String text){
SharedPreferences preferences= getActivity().getSharedPreferences("Content", Context.MODE_PRIVATE);
SharedPreferences.Editor editor=preferences.edit();
editor.putString("temperature", text);
editor.apply();
}
- 实现根据温度的高低选择穿搭(没有找到适合的免费开源库)
private final static int MIN_TEMP = 1; //10度以下
private final static int MID_TEMP = 2; //10-20度
private final static int MAX_TEMP = 3; //20度以上
private int count = 0;
private String temperature ;
private int temper ;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_xml, container, false);
iv_bg = (ImageView)view.findViewById(R.id.iv_bg);
tv_change = (TextView)view.findViewById(R.id.tv_change);
GetData();
tv_change.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//在确定了的温度范围内的衣服进行更换衣服套数
for (int i = 1; i < 4;i++) {
ChangeColoth(i);
}
}
});
return view;
}
//获取存储的温度数据
public void GetData(){
SharedPreferences preferences=getActivity().getSharedPreferences("Content", Context.MODE_PRIVATE);
temperature=preferences.getString("temperature", "temperature");
//将字符串类型的温度转换成整型
temper = Integer.parseInt(temperature );
JudgeTem(temper);
tv_change.setText("现在温度:"+temperature);
L.i("XMLFragment","从sharedPreferences文件中读取存储的sceneId"+temperature);
}
//判断温度的范围
public void JudgeTem(int t){
if (t < 10){
temper = MIN_TEMP;
ChangeColoth(temper);
}
else if (t > 10 && t <20){
temper = MID_TEMP;
ChangeColoth(temper);
}
else if (t > 20){
temper = MAX_TEMP;
ChangeColoth(temper);
}
}
//根据温度级别选择穿搭
public void ChangeColoth(int temp){
switch (temp){
//低温
case MIN_TEMP:
iv_bg.setBackgroundResource(R.drawable.ic_clo_05); //10以下
break;
//常温
case MID_TEMP:
iv_bg.setBackgroundResource(R.drawable.im_bg_2); //10-20
break;
//高温
case MAX_TEMP:
iv_bg.setBackgroundResource(R.drawable.ic_clo_02); // 20以上
break;
}
}
- 实现根据实时时间滑动时间轴,并可以编辑数据保存
// 初始化显示的数据
public void initData(){
listItem = new ArrayList<HashMap<String, Object>>();/*在数组中存放数据*/
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("ItemTitle", "起床");
map.put("ItemText", "7:00");
listItem.add(map);
timeLineMakerView.setBeginLine(resources.getDrawable(R.color.blue_sky));
timeLineMakerView.setEndLine(resources.getDrawable(R.color.blue_sky));
timeLineMakerView.setMarkerDrawable(resources.getDrawable(R.drawable.timeline_bg_bule));
}
//获取系统时间
public void GetTime(){
hour = cal.get(Calendar.HOUR); //以小时为单位,12个时间轴
int minute = cal.get(Calendar.MINUTE);
int second = cal.get(Calendar.SECOND);
DivideTime(hour);
}
//根据时间,分成24小时,改变时间轴颜色
public void DivideTime(int hour){
Resources resources =getActivity().getResources();
switch (hour){
case 0:
timeLineMakerView1.setBeginLine(resources.getDrawable(R.color.colorAccent));
timeLineMakerView1.setEndLine(resources.getDrawable(R.color.colorAccent));
timeLineMakerView1.setMarkerDrawable(resources.getDrawable(R.drawable.timeline_bg_red));
break;
case 1:
timeLineMakerView2.setBeginLine(resources.getDrawable(R.color.colorAccent));
timeLineMakerView2.setEndLine(resources.getDrawable(R.color.colorAccent));
timeLineMakerView2.setMarkerDrawable(resources.getDrawable(R.drawable.timeline_bg_red));
break;
case 2:
timeLineMakerView3.setBeginLine(resources.getDrawable(R.color.colorAccent));
timeLineMakerView3.setEndLine(resources.getDrawable(R.color.colorAccent));
timeLineMakerView3.setMarkerDrawable(resources.getDrawable(R.drawable.timeline_bg_red));
break;
}
//设置item的点击事件,获取子控件的值
myAdapter = new MyAdapter(getActivity(),listItem);
Rv.setAdapter(myAdapter);
myAdapter.setOnItemClickListener(new MyAdapter.OnItemClickListener() {
@Override
public void OnItemClick(View view, int position) {
ItemTime = mItem.get(position).getItemText1();
ItemTitle = mItem.get(position).getItemTitle1();
count ++;
saveSelectData(ItemTime,ItemTitle);
}
});
//保存用户输入的数据数据
private void saveSelectData(String tile, String time){
SharedPreferences preferences= getActivity().getSharedPreferences("Content", Context.MODE_PRIVATE);
SharedPreferences.Editor editor=preferences.edit();
editor.putString(tile, tile);
editor.putString(time, time);
editor.apply();
}
难点:MyAdapter
public class MyAdapter extends RecyclerView.Adapter{
private LayoutInflater inflater;
private ArrayList<HashMap<String, Object>> listItem;
private Context context;
//构造函数,传入数据
public MyAdapter(Context context, ArrayList<HashMap<String, Object>> listItem) {
inflater = LayoutInflater.from(context);
this.listItem = listItem;
}
//定义Viewholder
class Viewholder extends RecyclerView.ViewHolder {
private EditText thing, time;
private TimeLineMakerView timeLineMakerView;
public Viewholder(View root) {
super(root);
thing = (EditText) root.findViewById(R.id.et_thing);
time = (EditText)root.findViewById(R.id.et_time);
timeLineMakerView = (TimeLineMakerView)root.findViewById(R.id.time7);
root.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onItemClickListener!=null){
onItemClickListener.OnItemClick(v,(int)v.getTag());
}
}
});
}
public EditText getThing() {
return thing;
}
public TextView getTime() {
return time;
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new Viewholder(inflater.inflate(R.layout.recycler_item, null));
}//在这里把ViewHolder绑定Item的布局
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
Viewholder vh = (Viewholder) holder;
// 绑定数据到ViewHolder里面
vh.thing.setText((String) listItem.get(position).get("ItemTitle"));
vh.time.setText((String) listItem.get(position).get("ItemText"));
}
//返回Item数目
@Override
public int getItemCount() {
return listItem.size();
}
public interface OnItemClickListener{
public void OnItemClick(View view,int position);
}
private OnItemClickListener onItemClickListener;
public void setOnItemClickListener(OnItemClickListener onItemClickListener){
this.onItemClickListener=onItemClickListener;
}
}
[4] 感谢
- 感谢老师的辛苦教学,您辛苦了!
- 感谢团队伙伴们的团结一致,共同完成任务。
- 感谢项目中参考的技术博客简书文章的作者。