寫一個股票記錄APP,月目標數據可彈出一個Dialog進行修改。
但返回後發現數據沒變,TextView也沒變,原來代碼是在 確定 的button內綁定數據更新代碼
//本月目標對話框
private void targetDialog(){
final EditText dialogTV=new EditText(MainActivity.this);
dialogTV.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL);
AlertDialog.Builder targetD=new AlertDialog.Builder(MainActivity.this);
targetD.setView(dialogTV);
targetD.setTitle("修改本月目標");
targetD.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if(TextUtils.isEmpty(dialogTV.getText())){
Toast.makeText(MainActivity.this,"Input can not empty.",Toast.LENGTH_SHORT).show();
}else {
float mtarget=Float.parseFloat(dialogTV.getText().toString().trim());
/* 存入mTarget*/
try{
MyDataBaseHelper helper=new MyDataBaseHelper(MainActivity.this);
SQLiteDatabase db=helper.getWritableDatabase();
ContentValues cv=new ContentValues();
cv.put(COLUMN_MONTHDATA_MTARGET,mtarget);
db.update(TABLE_MONTHDATA,cv,"mYear=? and mMonth=?",new String[]{MainJumpYear,MainJumpMonth});
Toast.makeText(MainActivity.this,"insert"+mtarget+MainJumpYear+MainJumpMonth,Toast.LENGTH_SHORT).show();
//db.execSQL("UPDATE monthdata set mTarget="+mtarget+" WHERE mYear="+MainJumpYear+" and mMonth="+MainJumpMonth);
db.close();
}catch (SQLException e){
Toast.makeText(MainActivity.this,"SQL wrong",Toast.LENGTH_SHORT).show();
}
}
}
}).show();
}
後來找到問題所在,MainActivity是一個singleTask的活動,我在onPause()內綁定了把頁面數據更新的函數returnSave():
//退出時保存數據或輸入新mTarget保存
private void returnSave(){
try{
dbHelper=new MyDataBaseHelper(this);
SQLiteDatabase sqLiteDatabase=dbHelper.getWritableDatabase();
ContentValues contentValues=new ContentValues();
contentValues.put("mTarget",mTartget.getText().toString());
sqLiteDatabase.update("monthdata",contentValues,"mYear=? and mMonth=?",new String[]{MainJumpYear,MainJumpMonth});
sqLiteDatabase.close();
contentValues.clear();
}catch (SQLiteException e){
}
}
因此就算數據庫內數據更新了,一跳轉後,數據又被改回去了。因而我選擇一種折中方法,直接修改TextView的值,等跳轉時就可以修改數據了。但問題又來了,光修改TextView,裏面的其他數據不會變動,看起來就很彆扭,如何刷新當前數據呢?
查了下相關的做法,找了三種:
1.手動刷新activity界面的數據:在activity類下增加一個refresh()方法
注意這種刷新方法只適用於只有一個activity的實例
public void refresh() {
onCreate(null);
}
2.刷新另一個activity界面數據(自動刷新):
在涉及到刷新的activity類下重寫onResume()方法
/**
* 調用onCreate(), 目的是刷新數據, 從另一activity界面返回到該activity界面時, 此方法自動調用
*/
@Override
protected void onResume() {
super.onResume();
onCreate(null);
}
3.先保存saveInstanceState,再刷新頁面
//刷新另一個activity界面數據:
public Bundle s;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.s = savedInstanceState;
對於第一種,無法使用,可能因爲Activity比較多,第二種太頻繁,第三種未嘗試,感覺也不太好用。
還是自己想辦法,想到TextView修改了,直接刷新數據就行了,就把returnSave()做到button裏,然後再直接跳到onResume(),把數據Cursor更新放到onResume()裏,問題解決了。本來想放到onRestart()內,但是這樣就多了不少代碼。
修改後的Dialog代碼:
//本月目標對話框
private void targetDialog(){
final EditText dialogTV=new EditText(MainActivity.this);
dialogTV.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL);
AlertDialog.Builder targetD=new AlertDialog.Builder(MainActivity.this);
targetD.setView(dialogTV);
targetD.setTitle("修改本月目標");
targetD.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if(TextUtils.isEmpty(dialogTV.getText())){
Toast.makeText(MainActivity.this,"Input can not empty.",Toast.LENGTH_SHORT).show();
}else {
mTartget.setText(dialogTV.getText());
//存入數據
returnSave();
//刷新頁面數據,onResume()內重新加載數據
onResume();
}
}
}).show();
}
對於效率,感覺還行,刷新頻率不高,還有待改進的地方以後接着寫。