项目实战:硅谷金融APPday07 ToggleButton的巧用 &module 抽取成 库 & MPAndroidChart库实现柱状折线饼状图
不否认努力,继续加油!
学习整理重点、盲区,笔记如下:干干巴巴,麻麻赖赖,一点都不圆润……
day07
内容
1. MPAndroidChart库实现柱状图折线图饼状图
- 折线图绘制分析与实现;
- 可导入库使用,或者使用 jar 文件;
- 学习使用文档使用;https://github.com/PhilJay/MPAndroidChart;
2. ToggleButton的使用
-
布局文件.xml
<!--这里点击原生的button,不仅有字还有点击瞬间变黄的效果;设置textOn/textOff = "@null",不要仅仅设置""--> <ToggleButton android:id="@+id/toggle_more" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:background="@drawable/toggle_selector" android:layout_marginRight="10dp" android:textOff="@null" android:textOn="@null" /> <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/toggle_on" android:state_checked="true"></item> <item android:drawable="@drawable/toggle_off" android:state_checked="false"></item> </selector>
-
代码中设置监听
toggleMore.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { …… } else { ……
-
注意:这里可以把开关的状态写在本地 sp 保存,事后从本地获取是否打开,直接设置给开关;
sp = this.getActivity().getSharedPreferences("secret_protect", Context.MODE_PRIVATE); sp.edit().putBoolean("isOpen", true).commit(); boolean isOpen = sp.getBoolean("isOpen", false);
3. 手势密码开关设置
-
获取ToggleButton的保存状态;
如上,sp 保存到本地; -
设置监听;
如上,对开关的点击事件 -
设置手势开关操作;逻辑如下(PS:来自于宋红康老师):
-
判断本地用户是否开启了手势密码,如果开启,需要校验;
本地保存记录,用户是否设置了密码,通过该文件校验是否开启和存储了密码, -
PS:关于手势识别,用到了GestureEditActivity 、GestureVerifyActivity。实际上使用的是 gesturelock;
4. 将 module 抽取成 库
- 删除不需要的多余 .java文件;
- Manifest,xml 中把 application 中间所有内容删除;只留下
<application></application>
- build.gradle 文件中,把首行改为:
apply plugin: 'com.android.library'
- 删除 defaultConfig{ 中的 applicationID;
- 将本库添加到需要使用的 module 中 ;
5. 联系客服(调用电话)
-
代码;涉及到权限的校验
Intent intent = new Intent(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:" + phone)); if (ActivityCompat.checkSelfPermission(MoreFragment.this.getActivity(), Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { return; } MoreFragment.this.getActivity().startActivity(intent);
7. 联网更新应用
-
逻辑如下:(PS:来自尚硅谷:宋红康老师)
-
判断是否有网络;
联网成功与否,最终都要进入主页面; -
联网成功:联网获取响应数据;
-
判断两个版本是否一致;
获取当前版本:private String getVersion() { String version = "未知版本"; PackageManager manager = getPackageManager(); try { PackageInfo packageInfo = manager.getPackageInfo(getPackageName(), 0); version = packageInfo.versionName; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); //如果找不到对应的应用包信息, 就返回"未知版本" } return version; }
-
下载最新版;
private void downloadApk() { //初始化数据要保持的位置 File filesDir;if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ filesDir = this.getExternalFilesDir(""); }else{ filesDir = this.getFilesDir(); } apkFile = new File(filesDir,"update.apk"); //启动一个分线程联网下载数据: new Thread(){ @Override public void run(){ String path = updateInfo.apkUrl; InputStream is = null; FileOutputStream fos = null; HttpURLConnection conn = null; try { URL url = new URL(path); conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(5000); conn.setReadTimeout(5000); conn.connect(); if(conn.getResponseCode() == 200){ dialog.setMax(conn.getContentLength());//设置dialog的最大值 is = conn.getInputStream(); fos = new FileOutputStream(apkFile); byte[] buffer = new byte[1024]; int len; while((len = is.read(buffer)) != -1){ //更新dialog的进度 dialog.incrementProgressBy(len); fos.write(buffer,0,len); SystemClock.sleep(1); } handler.sendEmptyMessage(DOWNLOAD_APK_SUCCESS); }else{ handler.sendEmptyMessage(DOWNLOAD_APK_FAIL); } } catch (Exception e) { e.printStackTrace(); }finally{ if(conn != null){ conn.disconnect(); } if(is != null){ try { is.close(); } catch (IOException e) { e.printStackTrace(); } } if(fos != null){ try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } } }.start(); }
-
安装 apk;
private void installApk() { Intent intent = new Intent("android.intent.action.INSTALL_PACKAGE"); intent.setData(Uri.parse("file:" + apkFile.getAbsolutePath())); startActivity(intent); }
8. 其他
- 用户反馈;点击确定反馈后,将数据返回到后台,涉及到与后台操作,白给……
- 分享操作:集成ShareSDK;
盲区
- 声明:本博客根据尚硅谷项目实战: 硅谷金融.学习整理;
- 关于和MySQL、服务器的交互没有做,不太明白数据库和服务器端的操作;
- 对于 MPAndroidChart 的使用,有最新的,不过使用起来还是有些难以集成;
- 本节笔记多少有些水,值得关注的是 ToggleButton,还有库的抽取;
- ProgressDialog 已经被废弃无法使用,显示下载状态的通知效果没有做;
其他笔记
金融App
- 金融APP01—页面架构.
- 金融APP02—主页及工具类创建
- 金融APP03—自定义 MyScrollView & 联网加载数据的4种状态的抽取及代码优化
- 金融APP04—投资理财页面实现
- 金融APP05—随机飞入飞出&流式布局自定义View的使用
- 金融APP06—调用系统拍照、图库选择图片并设置为圆形
商城
Android项目实战—— 商城APP.
新闻
Android项目实战—— 新闻APP.