項目實戰:硅谷金融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.