2010年9月12日 星期日

儲存資料-Shared Preferences

儲存資料-Shared Preferences

話先說在前頭



基本上到了我們這個年紀,身高不太會變化,所以現在我們要將身高儲存起來,這樣就不用每次都要輸入了。
順便一提的是儲存資料有下列幾種方式:

用 key-value 的方式儲存


儲存在裝置的內部記憶體,應該是指ROM吧!


儲存在外部的記憶體,應該是SD卡。 


儲存在資料庫裏面


將資料儲存在網路的伺服器。

今天要用的是Shared Preferences這種方式。

首先我們要先import SharedPreferences進來。
import android.content.SharedPreferences;

然後新增三個變數,用來儲存身高的數字。
  1. private static final String TAG = "Bmi";
  2. public static final String PREF = "BMI_PREF";
  3. public static final String PREF_HEIGHT = "BMI_Height";


在 onCreate 我們要回復上次輸入的值,所以這邊我們多呼叫了 restorePrefs(); 
  1. public void onCreate(Bundle savedInstanceState) {
  2. super.onCreate(savedInstanceState);
  3.        setContentView(R.layout.main);
  4.       
  5.        findViews();
  6.        restorePrefs();
  7.        setListeners();
  8.     }   


在 restorePrefs()我們要做的就是將之前存入的數字讀出來,我們先宣告一個 SharedPreferences 型態的變數來讀取 PREF 的值。然後用 getString 來取得 PREF_HEIGHT 的數字,如果沒有的話就給空字串;如果有的話就塞入身高的欄位,並且讓體重那個欄位取的focus。這就是 25~34 行所做的事情。
  1.     private void restorePrefs() {
  2.        // TODO Auto-generated method stub
  3.         SharedPreferences settings = getSharedPreferences(PREF, 0);
  4.         String pref_height = settings.getString(PREF_HEIGHT, "");
  5.        if(! "".equals(pref_height))
  6.        {
  7.            fieldHeight.setText(pref_height);
  8.            fieldWeight.requestFocus();
  9.        }
  10.     }


在 onPause() 的時候我們要把身高儲存到 SharedPreferences 裡面去。所以我們先宣告一個 SharedPreferences 型態的變數來寫入 PREF 的值。呼叫 .edit() 跟 .putString() 來將 PREF_HEIGHT 的變數塞入身高的值。最後再 .commit() 起來。
  1.     protected void onPause(){
  2.         super.onPause();
  3.    
  4.         SharedPreferences settings = getSharedPreferences(PREF, 0);
  5.         settings.edit()
  6.          .putString(PREF_HEIGHT, fieldHeight.getText().toString())
  7.          .commit();
  8.     }


全部的新增的程式如下面所示。
  1. import android.content.SharedPreferences;

  2. public class Bmi2 extends Activity {
  3.     private static final String TAG = "Bmi";
  4.     public static final String PREF = "BMI_PREF";
  5.     public static final String PREF_HEIGHT = "BMI_Height";
  6.    
  7.     private View btnCalc;
  8.     private TextView fieldHeight;
  9.     private TextView fieldWeight;
  10.     private TextView result;
  11.     private TextView fieldSuggest;

  12.     /** Called when the activity is first created. */
  13.     @Override
  14.     public void onCreate(Bundle savedInstanceState) {
  15.        super.onCreate(savedInstanceState);
  16.        setContentView(R.layout.main);
  17.       
  18.        findViews();
  19.        restorePrefs();
  20.        setListeners();
  21.     }   
  22.    
  23.     private void restorePrefs() {
  24.        // TODO Auto-generated method stub
  25.         SharedPreferences settings = getSharedPreferences(PREF, 0);
  26.         String pref_height = settings.getString(PREF_HEIGHT, "");
  27.        if(! "".equals(pref_height))
  28.        {
  29.            fieldHeight.setText(pref_height);
  30.            fieldWeight.requestFocus();
  31.        }
  32.     }

  33.     @Override
  34.     protected void onPause(){
  35.         super.onPause();
  36.    
  37.         SharedPreferences settings = getSharedPreferences(PREF, 0);
  38.         settings.edit()
  39.          .putString(PREF_HEIGHT, fieldHeight.getText().toString())
  40.          .commit();
  41.     }


當我們再次執行BIM的程式的時候,程式就會自動取得上次輸入的數字,並且直接要你輸入體重。


2010年6月6日 星期日

傳送資料到新的Activity去

傳送資料到新的Activity去

話先說在前頭


前面我們已經學會如何在目前的Activity開啟一個新的Activity了,現在我要學怎麼傳送資料到新的Activity去。

首先我們在上一篇的7~12中間加入8~11的程式。


    1.     private OnClickListener calcBMI = new OnClickListener() 
    2.     {
    3.         public void onClick(View v)
    4.         {
    5.           //Switch to report page
    6.           Intent intent = new Intent();
    7.           intent.setClass(Bmi2.this, Report.class);
    8.           Bundle bundle = new Bundle();
    9.           bundle.putString("KEY_HEIGHT", fieldHeight.getText().toString());
    10.           bundle.putString("KEY_WEIGHT", fieldWeight.getText().toString());
    11.           intent.putExtras(bundle);
    12.           startActivity(intent);
    13.         }
    14.     };

2010年5月30日 星期日

增加新的Activity

增加新的Activity!

話先說在前頭



Activity可以分為兩種
,獨立的Activity跟相依的Activity


獨立的Activity

獨立的Activity不需要跟其他的Activity相互交換資料,只要單純的用 startActivity 來啟動新的 Activity 就可以了。


相依的Activity

不同的Activity之間有資料的相互交換,又可以分為單向跟雙向兩種,Activity本身的資料會因為其他Activity的改變而改變。

2010年5月26日 星期三

加入Menu!

加入選單!

話先說在前頭


先看一下新加入的程式部分!

    1.     protected static final int MENU_ABOUT = Menu.FIRST;
    2.     protected static final int MENU_QUIT = Menu.FIRST + 1;   
    3.    
    4.     @Override
    5.     public boolean onCreateOptionsMenu(Menu menu){
    6.        super.onCreateOptionsMenu(menu);
    7.     menu.add(0, MENU_ABOUT, 0, "關於...");
    8.     menu.add(0, MENU_QUIT, 0, "結束");
    9.        return true;   
    10.   }
    11.    
    12.     @Override
    13.     public boolean onOptionsItemSelected(MenuItem item){
    14.          super.onOptionsItemSelected(item);
    15.          switch(item.getItemId()){
    16.          case MENU_ABOUT:
    17.          openOptionsDialog();
    18.                  break;
    19.          case MENU_QUIT:
    20.          finish();
    21.                  break;
    22.     }
    23.        return true;
    24.   }

2010年5月25日 星期二

開啟網頁!

開啟網頁!

話先說在前頭


現在我們要試用用程式打開一個網頁,所以我們是著在關於的視窗裡面放一個[首頁]的按鈕,按下去之後就直接連去我們指定的網頁。首先我們先把程式改成下面的樣子吧!程式新增的部分是15~25行。



    1.         private void openOptionsDialog() {
    2.             // TODO Auto-generated method stub
    3.             //Toast.makeText(Bmi2.this, "BMI2 計算器", Toast.LENGTH_SHORT).show();
    4.             new AlertDialog.Builder(Bmi2.this)
    5.             .setTitle("關於 Android BMI2")
    6.             .setMessage("Android BMI2 Calc")
    7.             .setPositiveButton("OK", new DialogInterface.OnClickListener() {
    8.                
    9.                 @Override
    10.                 public void onClick(DialogInterface dialog, int which) {
    11.                     // TODO Auto-generated method stub
    12.                    
    13.                 }
    14.             })
    15.             .setNegativeButton(R.string.homepage_label,
    16.                     new DialogInterface.OnClickListener() {
    17.                        
    18.                         @Override
    19.                         public void onClick(DialogInterface dialog, int which) {
    20.                             // TODO Auto-generated method stub
    21.                             Uri uri = Uri.parse("http://androidbmi.googlecode.com/");
    22.                             Intent intent = new Intent(Intent.ACTION_VIEW, uri);
    23.                             startActivity(intent);
    24.                         }
    25.                     })
    26.             .show();
    27.         }

2010年5月23日 星期日

增加對話框吧!

增加對話框吧!

話先說在前頭


現在我們要為程式加上一個關於的視窗。


  1. 首先我們要先在 import 的地方加上 android.app.AlertDialog;
  2. 在計算的 onClick 的最後面加上 openOptionsDialog(); ,然後利用上一篇教的自動的功能新增涵式吧。
  3. openOptionsDialog(); 加上程式下面的程式碼吧。

2010年5月21日 星期五

refatcor你的程式吧!

refatcor你的程式吧!

話先說在前頭

如果我們開始寫程式之前沒有先好好的規劃一下的話!通常會隨著功能越加越多,程式越寫越亂!這時候我們就需要refactor一下程式囉!refactor中文翻成重構,其實也有點像是重新整理程式碼的感覺。不過每個人整理的習慣不太一樣,所以這邊我並沒有完全按照gasolin的程式碼做囉!

看到散落一地的 findViewsById 其實有點難過,整理的方式有兩種,一種是集中起來在一個procedure裡面,另一種就是寫成物件的屬性囉!
先來示範第一種方式