上一篇文章我們講的是實時記錄APP介面的搭建:帶你做專案——實時記錄APP:02搭建佈局,本篇文章就來實現APP中的邏輯功能。
/** * 加號按鈕的點選事件 * @param v */ public void btn_click(View v){ EditText editText = new EditText(this); //new出一個對話方塊 new AlertDialog.Builder(this) .setTitle("請輸入內容") .setView(editText)//對話方塊加一個edittext用於輸入內容 .setPositiveButton("確定", new OnClickListener() { //確定按鈕的點選事件 @Override public void onClick(DialogInterface dialog, int which) { //在這裡儲存資料並重新整理listview } }) .setNegativeButton("取消",null) .show(); }
執行看一下效果:
效果和預期一樣,還是不錯的,我們要的是快速,所以可以在彈出對話方塊的同時把輸入法也彈出來就更快了。那麼,讓輸入法也彈出來吧。程式碼就變成了這樣:
/** * 加號按鈕的點選事件 * @param v */ public void btn_click(View v){ final EditText editText = new EditText(this); //new出一個對話方塊 new AlertDialog.Builder(this) .setTitle("請輸入內容") .setView(editText)//對話方塊加一個edittext用於輸入內容 .setPositiveButton("確定", new OnClickListener() { //確定按鈕的點選事件 @Override public void onClick(DialogInterface dialog, int which) { //在這裡儲存資料並重新整理listview } }) .setNegativeButton("取消",null) .show(); //調出鍵盤 editText.post(new Runnable() { @Override public void run() { InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(editText, 0); } }); }
看下效果:
1.將資料儲存到檔案
我們一次要儲存兩個資料,一個是內容,一個是時間。兩者都可以很方便的獲取到。唯一要考慮的是資料儲存的格式,既然我們要把所有資料一行行儲存在一個文字檔案中,那麼這兩個資料就要能夠分離,這樣讀取的時候就能區分哪一部分是內容,哪一部分是時間。因此我自己定義一個分隔符即可。
首先定義兩個路徑常量:一個是檔案路徑,一個是檔案目錄路徑,要分清楚
private static final String FILEPATH = Environment.getExternalStorageDirectory().getPath()+"/IntimeRecord/record.db";
private static final String DIRPATH = Environment.getExternalStorageDirectory().getPath()+"/IntimeRecord";
然後:
//1.獲得內容和當前時間 String content = editText.getText().toString();//得到內容 String time = getNowTime();//得到當前時間 String save = content+ "^"+time;//以^分割兩者,讀取的時候再分開即可 saveToFile(save);//將內容儲存到檔案中
/** * 獲得當前時間 * @return 格式為 年-月-日-時h-分m-秒s 的字串 比如2019-11-20-21h24m19s */ protected String getNowTime() { //從calendar物件中拿到時間 Calendar c = Calendar.getInstance();//得到calendar物件 String mYear = String.valueOf(c.get(Calendar.YEAR)); // 獲取當前年份 String mMonth = String.valueOf(c.get(Calendar.MONTH) + 1);// 獲取當前月份 String mDay = String.valueOf(c.get(Calendar.DAY_OF_MONTH));// 獲取當日期 String mHour = String.valueOf(c.get(Calendar.HOUR_OF_DAY));//時 String mMinute =String.valueOf(c.get(Calendar.MINUTE));//分 String mSecond =String.valueOf(c.get(Calendar.SECOND));//秒 return mYear+"-"+mMonth+"-"+mDay+"-"+mHour+"h"+mMinute+"m"+mSecond+"s"; }
/** * 向檔案中新增一行資料 * @param save */ protected void saveToFile(String content) { //首先建立資料夾 File file = new File(DIRPATH); if(!file.exists()){ file.mkdir(); } //然後建立檔案 注意路徑必須指定到檔名才行 file = new File(FILEPATH); FileWriter writer = null; try { writer = new FileWriter(file, true);//第二個引數為true是追加內容,false是覆蓋 writer.write(content); writer.write("\\r\\n");//換行 } catch (IOException e) { e.printStackTrace(); } finally { try { if(writer != null){ writer.close(); } } catch (IOException e) { e.printStackTrace(); } } }
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
然後看一下效果,在外接儲存目錄中有一個IntimeRecord資料夾,下面有個record.db檔案,以文字的方式開啟就能看到資料了
然後是在listview中顯示資料了。儲存好資料後,從檔案中讀取即可。這個時候,我們不能從檔案中直接讀取一行
行的資料顯示在listview中,效率低,需要將資料從檔案中一下子讀出來,然後放進一個容器中,最好的容器就是
我們首先要先修改listview的資料介面卡。
定義一個list:private List<String> list = new ArrayList<String>();
然後修改listview的介面卡:
class MyAdapter extends BaseAdapter{ @Override public int getCount() { // TODO Auto-generated method stub return list.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return null; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub if(convertView == null){//這樣寫可以提高listview載入速度 convertView = View.inflate(MainActivity.this, R.layout.listview_view, null); } TextView tv_content = (TextView)convertView.findViewById(R.id.content); TextView tv_date = (TextView)convertView.findViewById(R.id.date); String text = list.get(list.size() - position - 1);//從最後記錄的資料開始顯示 String[] msg = text.split("\\\\^"); tv_content.setText(msg[0]); tv_date.setText(msg[1]); return convertView; } }
接著寫一個方法:
/** * 將檔案中的資料放入list中 */ private void fileToList() { //從檔案中讀取資料放到list中 list.clear();//首先要把list清空,避免資料堆積 FileReader fr; try { fr = new FileReader(new File(FILEPATH)); BufferedReader br = new BufferedReader(fr); String content = br.readLine(); while(content != null){ list.add(content); content = br.readLine(); } br.close(); fr.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }
然後再寫一個重新整理listview資料介面卡的方法:
/** * 重新整理listview的資料 */ protected void freshListView() { //1.將檔案中的資料放入list中 fileToList(); //2.重新整理listview介面卡 myAdapter.notifyDataSetChanged(); }
接著在輸入框的確定事件中呼叫即可:
public void onClick(DialogInterface dialog, int which) { //在這裡儲存資料並重新整理listview //1.獲得內容和當前時間 String content = editText.getText().toString();//得到內容 String time = getNowTime();//得到當前時間 String save = content+ "^"+time;//以^分割兩者,讀取的時候再分開即可 saveToFile(save);//將內容儲存到檔案中 freshListView(); }
這樣就可以實現listview資料的重新整理,但是開啟APP的時候也要載入資料,所以在APP的載入事件中新增fileToList方法即可。
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); fullScreen(this);//沉浸式狀態列 lv = (ListView)findViewById(R.id.lv);//獲得listview fileToList();//填充list myAdapter = new MyAdapter(); lv.setAdapter(myAdapter);//設定資料介面卡 通過內部類繼承baseAdapter }
到這一步,實際上就大功告成了,已經實現了最初設計的功能。效果圖:
下面是擴充功能
三、圖示的製作與新增
APP圖示怎麼修改?我在PS中做了一張圖片:
把它的名稱重新命名為ic_launcher.png然後複製到res目錄下的drawable開頭的資料夾中,覆蓋掉裡面的同名檔案即可。
圖片是個正方形的就行了,寬高一樣,大小無所謂。我做的這個是174X174的。
效果:
變成了這個樣子,模擬器上太醜了,安裝在真的手機上還是不錯的。
//listview的每一行的長按事件 lv.setOnItemLongClickListener(new OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) { //長按後彈出提示框,提示是否刪除 new AlertDialog.Builder(MainActivity.this) .setTitle("確定要刪除嗎") .setPositiveButton("確定", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //點選確定後進行刪除 //要知道刪除的是第幾行資料,在list中刪除後重新寫入檔案即可 //1.list中刪除該記錄 list.remove(list.size() - position -1); //2.檔案中刪除 //先刪除檔案 File file = new File(FILEPATH); file.delete(); //再重新寫入檔案 try { FileWriter fw = new FileWriter(file,true); for (int i = 0; i < list.size(); i++) { fw.write(list.get(i)+"\\r\\n"); } fw.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } //3.重新整理listview資料介面卡 freshListView(); } }) .setNegativeButton("取消", null) .show(); return true; } });
OK,到現在,擴充套件功能也做完了。