(更新源码)AndroidStudio新⼿开发:天⽓app(百度地图api+和风天⽓api。
。。
AndroidStudio新⼿开发:天⽓app(百度地图+和风天⽓api+城市查询+折线展⽰)
1、内容简介
学校b测,碰巧选到了app开发,之前只有⼀些⽹站开发经历,第⼀次接触安卓端,从配环境查攻略,到运⾏他⼈demo⼀步步理解与修改,到最后实现定位天⽓查询、展⽰等功能,⼿机上安装了⾃⼰的app后顿时成就感⼗⾜,写下此⽂记录此次开发的要点与攻略,同时为其他新⼿开发者排⼀些bug。界⾯展⽰如下:
2、环境配置
⾸先下载安装Android Studio并进⾏虚拟机配置,推荐参考链接如下:
3、导⼊他⼈demo
导⼊他⼈AS demo时往往会出现许多令⼈头疼的bug,在这⾥提醒⼤家⼀定要替换demo本⾝的⼀些配置信息后再⽤AS open an exisiting android studio project,推荐参考链接如下:
另外,如果出现长时间sync不成功很可能是因为从google下载被墙的原因,在源⽬录下的adle⽂件中进⾏阿⾥云镜像替换
4、AS 项⽬分析
成功运⾏他⼈demo之后重要的事情就是分析项⽬的架构了,相关资料链接:
在这⾥我再次着重强调⼏个⽂件:
1.app中的adle中引⼊了所有的包,如果报错缺少所需的包或版本不匹配时需要在⽂件中的dependencies中进⾏修改
2.运⾏项⽬后⽣成的app-debug.apk位于app.build.outputs.apk⽂件夹中。 //      google()    //    jcenter()        maven { url 'maven.aliyun/repository/google' }        maven { url 'maven.aliyun/repository/jcenter' }        maven { url 'maven.aliyun/nexus/content/groups/public' }
1
2
3
4
5  dependencies {        implementation fileTree(dir: 'libs', include: ['*.jar'])//    implementation 'com.android.support:appcompat-v7:29.+'        implementation 'com.straint:constraint-layout:1.1.3'        testImplementation 'junit:junit:4.12'        androidTestImplementation 'com.st:runner:1.0.2'        androidTestImplementation 'com.st.espresso:espresso-core:3.0.2'        implementation 'com.github.PhilJay:MPAndroidChart:v3.0.1'//    implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
3.所有的都位于app.main.src中,其中⼯作框架在java.activity中,页⾯布局在res.layout中。这两个⽂件夹为项⽬中的重中之重,涵盖了
项⽬的运⾏流程以及页⾯设计,需要仔细理解。
4.配置⽂件AndroidManife.XML中定义了app的名称和图标可进⾏修改。
5、天⽓项⽬流程
终于进⼊到了正题,本次开发的天⽓app名为“阴晴”,打开app,系统⾸先显⽰默认城市(西安)的天⽓信息,之后⽤户可以选择进⾏定位查询或⾃由选择城市:定位查询通过申请定位权限,调⽤百度地图api定位当前城市地图信息,并通过缓存定位城市⾄sharepreference,调⽤和风天⽓api⽣成当前城市的天⽓信息;⾃由选择城市通过数据表查询,调⽤和风天⽓api⽣成查询城市对应天⽓信息并显⽰。之后将此次天⽓信息保存⾄缓存sharepreference,下次打开app时显⽰缓存中城市的天⽓信息。页⾯显⽰上通过保存天⽓查询
数据⾄sharedpreference,通过建⽴图表可选择折线图显⽰近七天最⾼最低的温度变化情况。流程图设计如下:
6、数据探寻
7、模块架构
1.城市信息获取模块(cityselcetor activity)
通过数据库查询,依次查询选择的省份、城市,通过回调函数onActivityResult获取菜单选择城市的回调,将该城市名保存⾄sharedpreference后传递⾄天⽓查询模块获得天⽓信息。
<application
android:name=".MainApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="阴晴"
android:roundIcon="@mipmap/ic_launcher"
android:supportsRtl="true"
android:theme="@style/AppTheme">
1
2
3
4
5
6
7
8
/** * 查询全国所有的省,从数据库查询 */private void queryProvinces() {    ProvinceList.addAll(WeatherDB.Instance().getDatabase()));    data.clear();    for (Province province : ProvinceList) {        data.add(province.mProName);    }    currentLevel = LEVEL_PROVINCE;    if(mAdapter==null)    {        initAdapter();        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));    }    ifyDataSetChanged();}/** * 查询选中省份的所有城市,从数据库查询 */private void queryCities() {    CityList.addAll(WeatherDB.Instance().getDatabase(), selectedProvince.mProSort));    data.clear();    for (City city:CityList)    {        data.add(city.mCityName);
    }    currentLevel = LEVEL_CITY;    ifyDataSetChanged();    mRecyclerView.smoothScrollToPosition(0);}protected void onActivityResult(int requestCode, int resultCode, Intent data) {    ActivityResult(requestCode, resultCode, data);    if (requestCode == CitySelectorActivity.SelectorSuccessFromMenu) {        //来⾃于菜单选择城市的回调        if (resultCode == RESULT_OK) {            if (data == null) {                return;            }            Bundle bundle = Extras();            //城市名称            String cityName = String("CityName");            //获取到城市名称后可⾃⾏使⽤...            UpdataViewForMain(cityName);        }    }}private void UpdataViewForMain(String cityName){    //关闭侧滑栏    mDrawerLayout.closeDrawer(mNavView);    //获取OldCity 以便新城市不可加载时恢复数据    String OldCity = String("City",null);    //保存城市    editor.putString("City",cityName);    editormit();    //更新数据    mMainFragment.UpDataUi(OldCity);    //RecyclerView 回到顶部    mMainFragment.mRecyclerView.smoothScrollToPosition(0);}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
百度api接口
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
2.定位信息获取模块(Map activity)
通过调⽤百度地图api,读取当前定位并显⽰地图,通过定义⽅法navigate to移动⾄当前位置,并通过共享缓存区域sharedpreference将定位得到的城市进⾏保存,传递⾄天⽓查询模块获得当前城市的天⽓信息。
3.天⽓信息获取模块(MultipleItemQuickAdapter)
为了⽤GSON解析,⾸先将和风天⽓api接⼝中的JSON数据全部都写成了实体类(NewWeatherBean),利⽤模拟请求⼯具
Rest Client测试api接⼝⼯具是否正常,最后⽤getHeWeather6获取我们所需的数据。private void navig
ateTo(BDLocation location) {      if (isFirstLocate) {          LatLng ll = new Latitude(), Longitude());          MapStatusUpdate update = wLatLng(ll);          baiduMap.animateMapStatus(update);          update = To(16f);          baiduMap.animateMapStatus(update);          isFirstLocate = false;      }      MyLocationData.Builder locationBuilder = new MyLocationData.Builder();      locationBuilder.Latitude());      locationBuilder.Longitude());      MyLocationData locationData = locationBuilder.build();      baiduMap.setMyLocationData(locationData);  }  public class MyLocationListener implements BDLocationListener {      public String city;      private SharedPreferences.Editor  editor;      //共享参数      public void onReceiveLocation(final BDLocation Location) {          runOnUiThread(new Runnable() {              @Override              public void run() {                  if (LocType() == BDLocation.TypeGpsLocation || LocType() == BDLocation.TypeNetWorkLocation) {                      navigateTo(Location);                      editor = Instance(MapActivity.this);                      city = City();                      editor.putString("City", city);                      editormit();                  }                  button1 =(Button)findViewById(R.id.button);                  button1.setOnClickListener(new View.OnClickListener(){                      @Override                      public void  onClick(View v){                          editor = Instance(MapActivity.this);                          city = City();                 
        editor.putString("City", city);                          editormit();                          Intent intent=new Intent(MapActivity.this,MainActivity.class);                          startActivity(intent);                      }                  });                      }                  });              }          }      }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。