(更新源码)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小时内删除。
发表评论