美文网首页
Android#17 -- MyDay App (3)

Android#17 -- MyDay App (3)

作者: 喜欢书的女孩 | 来源:发表于2017-10-24 12:16 被阅读0次

[1]功能模块的完善

  • 实现多个城市的气温查询
  • 实现天气与穿搭的关联
  • 实现获取实时时间,显示对应的日程任务

[2] 效果图

1.jpg
2.jpg
3.jpg

[3] 显示代码

  1. 多个城市的气温查询
[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();

   }
  1. 实现根据温度的高低选择穿搭(没有找到适合的免费开源库)
 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;
       }
    }
  1. 实现根据实时时间滑动时间轴,并可以编辑数据保存
 // 初始化显示的数据
    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] 感谢

  1. 感谢老师的辛苦教学,您辛苦了!
  2. 感谢团队伙伴们的团结一致,共同完成任务。
  3. 感谢项目中参考的技术博客简书文章的作者。

相关文章

  • Android#17 -- MyDay App (3)

    [1]功能模块的完善 实现多个城市的气温查询 实现天气与穿搭的关联 实现获取实时时间,显示对应的日程任务 [2] ...

  • MyDay

    隐私政策 我们不会收集及任何形式存储来自你"MyDay - Todo & Habit"的任何数据或销售给广告或其他...

  • Android#15 -- MyDay App (1)

    文章目录一、 项目架构功能模块原型设计架构设计代码编写测试二、团队分工 [1] 功能模块 设想的功能模块图 [2]...

  • Android#16 -- MyDay App (2)

    [6] View 首页 自定义View 布局 [7] 清单文件 [8] 依赖包 [9] 团队成员 文档.png [...

  • MyDay - Todo & habits

    For English Users: Hi! Here are some instructions for our...

  • 20200224MyDay

    20200225: 50min LC + 10min健身听书;04:00-05:00 50min LC + 10m...

  • LINUX常用命令

    for循环 applist=(app1 app2 app3);for app in ${applist[@]};d...

  • web app 、native app、hybrid app比较

    1.app的分类 大致可以分为这3种: native app(原生app) web app hybrid app(...

  • Hybrid App—— WKWebView demo

    市场现有3类主流APP类型,分别为:Web App、Hybrid App、 Native App。 Hybrid ...

  • 条件和循环

    if判断 现在你看到我了 var app3 = new Vue({ el: '#app-3', data:...

网友评论

      本文标题:Android#17 -- MyDay App (3)

      本文链接:https://www.haomeiwen.com/subject/ggstpxtx.html