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裡面,另一種就是寫成物件的屬性囉!
先來示範第一種方式

2010年5月20日 星期四

開始動手修改你的專案吧!

開始動手修改你的專案吧!

話先說在前頭


接下來我們依照gasolin的方向繼續前進吧!現在我們要為程式的畫面加上可以輸入身高體重的欄位。

2010年5月18日 星期二

第一個Android專案

第一個Android專案

話先說在前頭


現在開始來做我們的第一個專案吧!

2010年5月17日 星期一

設定 Android 虛擬裝置

設定 Android 虛擬裝置

話先說在前頭


現在我們要來新增 Android 虛擬裝置 (Android Virtual Device),就是 Android 的模擬器,好讓你寫的程式可以有手機可以執行。


2010年3月25日 星期四

Android 開發環境的安裝與設定

Android 開發環境的安裝與設定

話先說在前頭

  • 先說我的環境跟安裝的項目,我的環境是Windows2000WinXP,安裝JDK 6、Eclipse 3.5 SR2。

開發環境的元件需求

  • JDK
    • JDK 5 or JDK 6 都可以。那當然裝JDK 6啦!
  • Eclipse IDE
    • Eclipse 3.5 (Galileo) or Eclipse 3.4 (Ganymede) or Eclipse 3.3 (Europa) 這三個版本都可以,依照慣例還是選最新的3.5吧!
    • 直接選 [for Java Developers] 的版本即可
  • ADT(Android Development Tools plugin),基於 Eclipse 的 Android 開發工具擴充套件。
  • Android SDK,Android 程式開發套件,包含 Android 手機模擬器(Emulator)。