自定义开关 &module 抽取成 库 & 实现 柱状 折线 饼状图—Android项目实战—金融APP07


不否认努力,继续加油!
学习整理重点、盲区,笔记如下:干干巴巴,麻麻赖赖,一点都不圆润……

day07

内容

1. MPAndroidChart库实现柱状图折线图饼状图

  1. 折线图绘制分析与实现;
  2. 可导入库使用,或者使用 jar 文件;
  3. 学习使用文档使用;https://github.com/PhilJay/MPAndroidChart;

2. ToggleButton的使用

  1. 布局文件.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>
    
  2. 代码中设置监听

    toggleMore.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (isChecked) {
            	……
            } else {
              	……
    
  3. 注意:这里可以把开关的状态写在本地 sp 保存,事后从本地获取是否打开,直接设置给开关;

    sp = this.getActivity().getSharedPreferences("secret_protect", Context.MODE_PRIVATE);
    sp.edit().putBoolean("isOpen", true).commit();
    boolean isOpen = sp.getBoolean("isOpen", false);
    

3. 手势密码开关设置

  1. 获取ToggleButton的保存状态;
    如上,sp 保存到本地;

  2. 设置监听;
    如上,对开关的点击事件

  3. 设置手势开关操作;逻辑如下(PS:来自于宋红康老师):
    在这里插入图片描述

  4. 判断本地用户是否开启了手势密码,如果开启,需要校验;
    本地保存记录,用户是否设置了密码,通过该文件校验是否开启和存储了密码,

  5. PS:关于手势识别,用到了GestureEditActivity 、GestureVerifyActivity。实际上使用的是 gesturelock

4. 将 module 抽取成 库

  1. 删除不需要的多余 .java文件;
  2. Manifest,xml 中把 application 中间所有内容删除;只留下<application></application>
  3. build.gradle 文件中,把首行改为:apply plugin: 'com.android.library'
  4. 删除 defaultConfig{ 中的 applicationID;
  5. 将本库添加到需要使用的 module 中 ;

5. 联系客服(调用电话)

  1. 代码;涉及到权限的校验

    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. 联网更新应用

  1. 逻辑如下:(PS:来自尚硅谷:宋红康老师)
    在这里插入图片描述

  2. 判断是否有网络;
    联网成功与否,最终都要进入主页面;

  3. 联网成功:联网获取响应数据;

  4. 判断两个版本是否一致;
    获取当前版本:

    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;
    }
    
  5. 下载最新版;

    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();
    }
    
  6. 安装 apk;

    private void installApk() {
        Intent intent = new Intent("android.intent.action.INSTALL_PACKAGE");
        intent.setData(Uri.parse("file:" + apkFile.getAbsolutePath()));
        startActivity(intent);
    }
    

8. 其他

  1. 用户反馈;点击确定反馈后,将数据返回到后台,涉及到与后台操作,白给……
  2. 分享操作:集成ShareSDK;

盲区

  1. 声明:本博客根据尚硅谷项目实战: 硅谷金融.学习整理;
  2. 关于和MySQL、服务器的交互没有做,不太明白数据库和服务器端的操作;
  3. 对于 MPAndroidChart 的使用,有最新的,不过使用起来还是有些难以集成;
  4. 本节笔记多少有些水,值得关注的是 ToggleButton,还有库的抽取;
  5. ProgressDialog 已经被废弃无法使用,显示下载状态的通知效果没有做;

其他笔记

金融App

  1. 金融APP01—页面架构.
  2. 金融APP02—主页及工具类创建
  3. 金融APP03—自定义 MyScrollView & 联网加载数据的4种状态的抽取及代码优化
  4. 金融APP04—投资理财页面实现
  5. 金融APP05—随机飞入飞出&流式布局自定义View的使用
  6. 金融APP06—调用系统拍照、图库选择图片并设置为圆形

商城

Android项目实战—— 商城APP.

新闻

Android项目实战—— 新闻APP.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章