自定義開關 &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.

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