(更新源码)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 '/repository/google' } maven { url '/repository/jcenter' } maven { url '/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
recommended是什么意思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、模块架构
physics是什么意思1.城市信息获取模块(citylcetor 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().getDataba())); data.clear(); for (Province province : ProvinceList) { data.add(province.mProName); } currentLevel = LEVEL_PROVINCE; if(mAdapter==null) { initAdapter(); mRecyclerView.tLayoutManager(new LinearLayoutManager(this)); } ifyDataSetChanged();}/** * 查询选中省份的所有城市,从数据库查询 */private void queryCities() { CityList.addAll(WeatherDB.Instance().getDataba(), lectedProvince.mProSort)); data.clear(); for (City city:CityList) { data.add(city.mCityNam
e); } 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.cloDrawer(mNavView); //获取OldCity 以便新城市不可加载时恢复数据 String OldCity = String("City",null); //保存城市 editor.putString("City",cityName); it(); //更新数据 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
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),利⽤模拟请求⼯具
rprRest Client测试api接⼝⼯具是否正常,最后⽤getHeWeather6获取我们所需的数据。private void navi
gateTo(BDLocation location) { if (isFirstLocate) { LatLng ll = new Latitude(), Longitude()); MapStatusUpdate update = wLatLng(ll); baiduMap.animateMapStatus(update); update = To(16f); baiduMap.animateMapStatus(update); isFirstLocate = fal; } MyLocationData.Builder locationBuilder = new MyLocationData.Builder(); locationBuilder.Latitude()); locationBuilder.Longitude()); MyLocationData locationData = locationBuilder.build(); baiduMap.tMyLocationData(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); it(); } button1 =(Button)findViewById(R.id.button); button1.tOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v){
editor = Instance(MapActivity.this); city = City(); editor.putString("City", city); it(); Intent intent=new Intent(MapActivity.this,MainActivity.class); startActivity(intent); } }); } }); } } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
total eclip15
16
17
18
19
20
possiblely21
22
23
24
25
尾毛26
sleep是什么意思
27
28
29
意大利语
30
31
32
33
34
david liu35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53