2013年7月1日 星期一

News


  • 109
  • http://tw.news.yahoo.com/
  • http://news.google.com.tw/
  • http://m.nownews.com/
  • http://m.udn.com/xhtml/index.jsp
  • http://news.msn.com.tw/
  • http://news.chinatimes.com/
  • http://www.appledaily.com.tw/realtimenews
  • http://mobile.n.yam.com/m/
  • http://news.pchome.com.tw/m/cat/index
  • http://news.sina.com.tw/
  • 2013年6月6日 星期四

    (Android) :: use handler to update UI

    package org.me.android_timer;
    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.widget.TextView;

    public class MainActivity extends Activity {
        private Long startTime;
        private Handler handler = new Handler();

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            startTime = System.currentTimeMillis();
            handler.removeCallbacks(updateTimer);
            handler.postDelayed(updateTimer, 1000);
        }

        private Runnable updateTimer = new Runnable() {
            public void run() {
                final TextView time = (TextView) findViewById(R.id.timer);
                Long spentTime = System.currentTimeMillis() - startTime;
                Long minius = (spentTime/1000)/60;
                Long seconds = (spentTime/1000) % 60;
                time.setText(minius+":"+seconds);
                handler.postDelayed(this, 1000);
            }
        };
    }

    (Android) :: setOnScrollListener

    GridView gridview = (GridView) findViewById(R.id.gridView1);

    gridview.setOnScrollListener(new OnScrollListener(){

       @Override
       public void onScroll(AbsListView arg0, int arg1, int arg2, int arg3) {
        // TODO Auto-generated method stub   
       
       }
       @Override
       public void onScrollStateChanged(AbsListView arg0, int arg1) {
        // TODO Auto-generated method stub  
          
       }
      
      });

    (Android) :: 取得手機螢幕長度和寬度

    DisplayMetrics dm = new DisplayMetrics();


    getWindowManager().getDefaultDisplay().getMetrics(dm);

    int width = dm.widthPixels;   int height = dm.heightPixels;

    2013年5月26日 星期日

    電腦開不了機,嗶嗶聲代表的意思?

    最近朋友的電腦開不了機,上網查了一下,覺得這些資料或許可以幫的上忙:

    AWARD BIOS
    ----------------------
    1短:系統啟動正常。
    2短:CMOS設定錯誤。
    一長一短:DRAM錯誤。
    一長二短:顯示卡或螢幕連接錯誤。
    一長三短:AGP 錯誤。
    一長九短:ROM錯誤。
    不斷長響:DRAM未插好。
    不停急響:電源有問題。

    AMI BIOS
    -----------------------
    1短:DRAM篞s錯誤。
    2短:DRAM 同位元檢查錯誤。
    3短:基本64K RAM檢查失敗。
    4短:計時器無法運算。
    5短:CPU錯誤。
    6短:8042無法取得A20(檢查鍵盤)。
    7短:CPU中斷錯誤
    8短:顯示卡記憶體寫入讀取錯誤(檢查顯示卡)。
    9短:ROM檢查碼錯誤。
    10短:CMOS 關機暫存器寫入讀取錯誤。
    11短:快取記憶體故障。

    Phoenix BIOS
    ----------------------
    1短:系統啟動正常
    1短1短1短:系統開機初始化失敗
    1短1短2短:主機板錯誤
    1短1短3短:CMOS或電池失效
    1短1短4短:ROM BIOS校驗錯誤
    1短4短3短:EISA時序器錯誤
    1短3短1短:RAM復新錯誤
    3短1短2短:主DMA暫存器錯誤
    3短1短3短:主中斷處理暫存器錯誤
    3短2短4短:主機板鍵盤控制器錯誤
    3短4短2短:顯示錯誤(顯示器或顯示卡)
    4短2短2短:關機錯誤
    4短4短1短:串列埠錯誤
    4短4短2短:並列埠錯誤

    IBM BIOS
    ---------------------------------------
    無:電源供應器或主機板完全損壞
    持續:主機板嚴重損壞
    短聲:系統自我測試,情況正常
    2短聲:自我測試發現錯誤 ( 錯誤訊息顯示於螢幕上 )
    持續短聲:電源供應器或主機板損壞
    1長1短:主機板有錯誤
    1長2短:顯示卡錯誤
    1長3短:顯示卡錯誤
    3長:鍵盤錯誤

    2013年5月24日 星期五

    HTC One 全球已賣出500萬支 仍供不應求!

    科技網站《SlashGear》周四 (23日) 報導,宏達電 (HTC)(2498-TW) 一位公司高層確認,HTC One 手機自從 3 月發售至今,已於全球創下 500 萬支的亮麗銷售佳績,且目前需求明顯仍高於供給量。
    宏達電近期消息讓公司蒙上陰影,近日傳出高層出走潮,且對打 Galaxy S4 手機成績上仍有差距,但根據《華爾街日報》指出,該名宏達電高層稱 HTC One 銷售實為強勁。
    該人士稱:「訂單數量目前為止都非常好,且仍超過我們的供給量。雖然這有部份原因是來自零件短缺,但這問題下個月可獲得解決,到時候就可以看到 HTC One 的真正光芒。」
    宏達電已公開宣稱,本月生產量將調昇一倍,4 月銷售數據也樂觀上揚。HTC One 原本打算在今 (2013) 年第 1 季末尾前,於全球 80 個國家開賣,但報導稱「UltraPixe」攝影鏡頭零件採購上有些問題,因此發售的市場範圍受到限制。
    但這並不影響宏達電的第 2 季強勁銷量預期,目前季度的營收估計將上達約 700 億新台幣 (24 億美元),增長幅度幾乎高達 10 億美元。


    原文網址: 表現亮眼!HTC One全球已賣出500萬支 仍供不應求 | 財經新聞 | NOWnews 今日新聞網 http://www.nownews.com/2013/05/23/320-2942591.htm#ixzz2UCDhHsjv

    2013年5月23日 星期四

    SVN :: 如何無條件還原到舊的revision

    當團隊一起開發程式,有很多人選擇用SVN來做版本控制,當程式開發人員不小心上傳錯誤的程式碼導致project無法build的時候,最後的選擇可以還原到之前好的版本,作法如下:

    情境 : 版本號 4058 (現存最新版,但是是錯的),想還原到 版本號 4020

    做法:

    1. 在local端創一個資料夾 A 並checkout 版本號 4058
    2. 在local端創一個資料夾 B 並checkout 版本號 4020
    3. 資料夾檔案設定選擇 "顯示所有檔案"
    4. 把資料夾 B 裡的檔案,除了.svn (記錄了svn的資訊) 這個資料夾外,全選並複製貼到資料夾A,全部覆蓋
    5. commit資料夾A
    6. 完成版本復原



    2013年5月22日 星期三

    Android :: 偵測網路狀態

    有些程式必須透過網路來執行某些動作,在執行這類網路相依的動作之前,最好先判斷目前的網路連線狀態,這樣可以免掉後續許多的防範機制,相關程式碼如下:

    private boolean isInternetConnected( )
    {
       ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService     
       (CONNECTIVITY_SERVICE); 

       NetworkInfo networkInfo= connectivityManager .getActiveNetworkInfo(); 

       if( networkInfo != null && networkInfo.isConnected( ) )
      { 
          return true; 
       }
      else
      { 
          return false; 
      }   
    }

    補充:
    記得在AndroidManifest.xml裡加入

    Android :: 生命週期 lifecycle

    Android 跟 一般windows的程式不一樣,他引進了所謂的lifecycle的概念,針對程式而言,最明顯的不同在於您所設計的程式,有可能被系統自動終結掉,這對於傳統的程式設計師或使用者來說是很不可思議的事,以前,除非是程式自己結束(正常或不正常),不然是不會自動消失的,Android系統則完全掌控了程式的生殺大權,當記憶體不足或其他原因,系統是可以無責的將您的程式給結束掉的,後來,Win8也導入lifecycle。

    Android的lifecycle分為幾個階段,用程式來看就一目了然了:

    public class Activity extends ApplicationContext {
       protected void onCreate(Bundle savedInstanceState);
       protected void onStart();
       protected void onRestart();
       protected void onResume();
       protected void onPause();
       protected void onStop();
       protected void onDestroy();
      }

    底下是擷取自Android官方網站的流程圖:


    Android :: 非同步線程 AsyncTask

    網路上很多AsyncTask的說明和例子,但我相信應該有很多初學者應該都有看沒有懂, 如果您是已經看過網路上的例子但還是不會用的話, 可以看看以下的例子, 這篇文章的主要目的, 是要您能真的用得出來, 實作成功了, 再去查相關資料, 成就感就不同了! 如果您有以下的需求: 事件2必須等待事件1完成後再做的話, 您就有AsyncTask實作的動機了。 首先,設計一個名子叫做MyTask的class,其他照抄。 doInBackground裡面放的就是要做的事件1, 而onPostExecute裡面放的就是事件2, class實作結束!!! class MyTask extends AsyncTask{ @Override protected voiddoInBackground(Integer... params) { 事件1; } @Override protected void onPostExecute(String result) { 事件2; super.onPostExecute(result); } } 再來,就是在MainThread裡面呼叫了, 可以在OnCreate裡面做: MyTask myTask = new MyTask(); myTask(100); 結束了!!

    Android :: 對話方塊

    對話方塊,和之前介紹過的Toast一樣,是用來通知使用者的,但要注意其應用情境,有些區別,這邊就不多說了,google上資料應該很多。 Android的對話方塊實作也是很簡單,以下照慣例,用程式碼來解說: AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this); 首先是產生一個AlertDialog實體,這個實體要出現在哪裡呢?一般來說就是這段程式碼鎖在的Activity,預設就是MainActivity.this。 dialog.setTitle("關於 dialog"); 這是設置dialog標題的用法。 dialog.setMessage("message content"); 這是設置dialog內容的用法。 dialog.show(); 這是最後一個步驟了,就是把dialog給show出來。 結束。

    coupon

    • 1129
    • http://www.kfcclub.com.tw/Menu/Coupon/
    • http://campaign.mcdonalds.com.tw/Campaign_20130828_Coupon/
    • https://docs.google.com/document/d/1oau68PPEY5jk0UJBfPgzkdbpaEwq7UDIxddNsHqpu1M/edit?usp=sharing
    • http://www.mos.com.tw/index.aspx
    • https://docs.google.com/document/d/16cU9-ieaNONMNd4bQtHkD_RvYAQPBUzcquogpe0WhSU/pub
    • http://www.burgerking.com.tw/news.php?id=208
    • https://docs.google.com/document/d/1hkW58Vwiz-Wi4wPSmg7la7b3I3cOjGmYSXHAgjcFIo8/edit?usp=sharing
    • http://www.pec21c.com.tw/ctmNewsList.html?leftMenuId=2800
    • http://www.tkkinc.com.tw/news_1.asp?n=1
    • http://www.twsubway.com/www/include/index.php?Page=2
    • https://docs.google.com/document/d/1mVc9c2Bw8cDMf9JO6p1syRRiFJjLFZ7c2wxn3NLrpQg/pub
    • http://www.coldstone.com.tw/04_news.asp
    • https://docs.google.com/document/d/1dqL_wtma82-nxqS9oMU46BplwmH-aNW6Qykm83OAqSw/pub
    • https://docs.google.com/document/d/1dqL_wtma82-nxqS9oMU46BplwmH-aNW6Qykm83OAqSw/edit?usp=sharing
    • http://www.starbucks.com.tw/stores/allevent/stores_allevent.jspx
    • https://docs.google.com/document/d/1ghWc4OmNiibSI-l0JywSZweV3IJs-eudEpzB-7naW_w/pub
    • https://docs.google.com/document/d/1ghWc4OmNiibSI-l0JywSZweV3IJs-eudEpzB-7naW_w/edit?usp=sharing
    • https://www.mrbrown.com.tw/news/index.aspx
    • https://docs.google.com/document/d/1x4M73_TqoipjRFnx5NsbNpphN-_3oPNLFDIVk-PF-Xk/pub
    • http://www.85cafe.com/newsactivity.php
    • https://www.sushiexpress.com.tw/news
    • http://www.sushiexpress.com.tw/qrcode/view.php?id=209
    • http://www.pizzahut.com.tw/promotions/#pwds
    • https://docs.google.com/document/d/1xA3auHeUnYxAZeAYxElXkbVXYBgoGd2n5ICY7gcCVzo/pub
    • https://docs.google.com/document/d/1xA3auHeUnYxAZeAYxElXkbVXYBgoGd2n5ICY7gcCVzo/edit?usp=sharing
    • http://www.dominos.com.tw/Phone/PhoneHome.aspx
    • https://www.0800076666.com.tw/Info/InfoSets
    • http://www.carrefour.com.tw/promo-catalogs
    • http://www.pxmart.com.tw/px/edmindex.px?id=3666#features/5

    2013年5月21日 星期二

    Android :: 開啟程式Internet permission

    在設計Android程式時,有些存取Internet的程式法,需要事先開啟Internet Permission,否則會出現Internet Permission Deny的Exception,要如何開啟程式的Internet Permission,很簡單,只要將以下的程式碼:



    加入到 AndroidManifest.xml 檔案中,記得,這句必須在 中間,且自己為root node。

    2013年5月19日 星期日

    (Android) 新增頁面

    以下解說如何新增一個名為NewActivity的頁面,需要準備的工作有:

    (1). 產生需要的檔案: NewActivity.java 及 NewActivity.xml
           在NewActivity.java的OnCreate( )加入: setContentView(R.layout.NewActivity); 


    (2). 在 AndroidManifest.xml 裡加入:
     
         


    (3). 在欲連結到NewActivity的頁面裡,加入對應的程式碼,使之可以連結到NewActivity:
     
        Intent intent = new Intent();
        intent.setClass(MainActivity.this, NewActivity.class);
        startActivity(intent);


    可以把(3)放到一個Button的Onclick事件裡,就可以很容易的看出結果了。

    (Android) 造訪網頁

    Android 瀏覽網頁非常簡單,只需要幾行的程式碼,以下的範例是當使用者按下按鈕後,會連結到特定網頁的寫法:


    // 與UI拉好的button (id : myInternet) 作連結
    button_Internet= (Button)findViewById(R.id.myInternet);

    button_Internet.setOnClickListener(buttonInternet);



    private Button.OnClickListener buttonInternet = new Button.OnClickListener( )
    {
       Uri uri = Uri.parse("http://cte-ccu.blogspot.tw/");
       Intent intent = new Intent(Intent.ACTION_VIEW, uri);
       startActivity(intent);
    };

    (Android) 如何產生Toast 訊息

    Toast訊息和一般的對話方塊訊息最大的不同在於應用情境,通常對話方塊式訊息出現後,畫面會focus在對話方塊,並等待使用者下一步指示,譬如按對話方塊上的確定或取消等等按鈕,而Toast則是將訊息顯示在螢幕上,經過一定時間後會自動消失,在盡量不打擾使用者的前提下達到訊息通知的目的,以下將用範例說明如何使用Toast:(按一個按鈕後出現Toast):

    在UI配置上,拉一個按鈕,id設為about,
    在欲顯示Toast的頁面程式碼裡(預設為MainActivity.java),加入以下程式碼:

    // 產生一個按鈕 button_about ,並與 UI 拉好的按鈕 "about" 作連結
    button_Toast = (Button)findViewById(R.id.about);


    button_Toast .setOnClickListener(aboutToast);

    private Button.OnClickListener aboutToast= new Button.OnClickListener( )
    {
       public void onClick(View arg0){
          Toast popMsg = Toast.makeText(MainActivity.this, R.string.bmi_about, Toast.LENGTH_SHORT);
          popMsg.show();
       }
    };

    2013年5月13日 星期一

    (C++) 支配值數目

    已知兩已排序陣列,求第一個陣列元素比第二個陣列元素大的個數總和。

    #include < iostream >
    using namespace std;
    int GreateCount(int f[], int g[], int numf, int numg)
    {
     int length = 0;
     int sum = 0;
     for(int i = 0; i < numf; ++i)
     {
      while(length < numg)
      {
       if(f[i] > g[0 + length])
        length++;
       else
        break;  
      }
      sum += length;
     }
     return sum;
    }

    int main(void)
    {
     int f[] = {1, 3, 5, 7, 9, 10, 11};
     int g[] = {2, 3, 4, 7, 8};
     int sum = GreateCount(f, g, 7, 5);
     cout << "Sum = " << sum << endl;
    }

    2013年5月12日 星期日

    (C++) 找出最長平台的長度,並將之印出

    在一個已經排序好的數字陣列,找出最常的平台並將之印出,所謂最常的平台,譬如一個陣列為1, 2, 2, 3, 3, 3, 4, 5, 5, 6,其中3, 3, 3即為此陣列的最常平台。


    #include < iostream >
    #include < vector >

    using namespace std;

    int longest_plateau(vector::iterator itr, vector::iterator itrEnd, int& number)
    {
     int length = 1;

     for(itr += 1; itr != itrEnd; ++itr)
     {
      if(*itr == *(itr - length))
      {
       number = *itr;
       ++length;
      }
     }
     return length;
    }

    int main(void)
    {
     int arrayNumbers[] = {1, 2, 2, 3, 3, 3, 4, 5, 5, 6};
     vector numbers(arrayNumbers, arrayNumbers + 10);
     int number = 0;
     int length = longest_plateau(numbers.begin(), numbers.end(), number);

     for(int i = 0; i < length; ++i)
      cout << number << " ";

    }

    2013年5月9日 星期四

    (C++) 淺談指標


    C語言用 " * " 來宣告一個指標型態的變數,例如,想要宣告一個指向int的指標可以這樣做 :      int* intPtr;   intPtr是用來指向一個int變數的指標,intPtr儲存的是int變數的位址,而這個位址所對應到的地址所存的變數值,可以用*intPtr來表示。   例子:

    #include < iostream >
    void main( )
    {
       int var = 10;
       int* intPtr = &var ;
       std::cout << "變數var的位址:" << intPtr << std::endl;
       std::cout << "指標intPtr所指向的變數的值:" << *intPtr << std::endl;
    }

    剛開始我們會被指標搞得頭暈腦脹,主要是因為指標在宣告時期和使用時期非常類似,但又不完全相同,在宣告時期,筆者習慣寫成(注意星號的位置)

       int* intPtr;

    而不是

       int *intPtr;

    宣告成int* intPtr; 筆者認為更貼近於指標所隱含的意思 -> intPtr是一種指向int型態變數的指標。

    既然intPtr是一種指標,不同於一般的變數如 int intVal; 其中intVal是一個型態為int的變數,變數所存的內容是變數值,而指標所存的值則是"位址",例如:

       intPtr = &intVal;

    則intPtr這個指標所存的值是intVal變數的地址,有了地址,要如何找到intVal所存的變數呢?答案就是要靠 " * "來取值,也就是 *intPtr。

    簡單來說,除了宣告時期,當你在程式內容中看到沒跟" * "搭配出現的指標變數,他是想表達"位址",而與" * "搭配一起出現的指標變數,他想表達的是他所存的地址所指向的變數值(可能是另一指標所存的地址,這就是雙重指標的意義)。




    (C++) 使用不定長度引數之函式

    不定個數引數之函式,顧名思義,就是一個可以餵不定個數引數的函式,引數可以3個、6個、9個等等,要使用不定個數引數,必須加入標頭檔 :   #include

    提供了幾個可使用的巨集,用以實現不定個數引數

    va_list : 在va_start、 va_arg與va_end三個巨集使用時當作參數使用。
    va_start : 開始不定長度引數的巨集。
    va_arg : 讀取不定長度引數的巨集。
    va_end : 結束不定長度引數的巨集。

    範例如下:


    #include
    #include

    void test(int argNum, ...)
    {
       va_list argList;
       va_start(argList, argNum);
       for(int i = 0; i < argNum; ++i)
          std::cout << va_arg(argList, double) << std::endl;
       va_end(argList);
    }


    void main( )
    {
       double a = 1.02, b = 3.22, c = 5.22;
       double d = 2.22, e = 8.98, f = 0.99;

       test(3, a, b, c);
       test(6, a, b, c, d, e, f);
    }

    2013年5月8日 星期三

    (C++) 輸入字串控制 - 數字篇

    如果有一個地方可以讓使用者輸入,而且限制只能輸入數字型態,數字型態包括了正負數及小數,可以參考以下方法:

    當使用者每件入一個按鍵,就呼叫此function:

    void __fastcall OnEditPress(TObject *Sender, wchar_t &Key)
    {
     std::wstring numerics(L"0123456789");
     TEdit *EditExit = (TEdit*)Sender;
     std::wstring editString = EditExit->Text.c_str();

     if((Key < L'0' || Key > L'9') && Key != L'\b' && Key != L'.' && Key != L'-')
     {
      Key = 0;
      return;
     }
     // avoid ".3"
     bool pointErrorUsing = (editString.find_first_of(L'.') != std::wstring::npos)
           || (editString.find_first_of(numerics) == std::wstring::npos);
     if(Key == L'.' && pointErrorUsing)
     {
      Key = 0;
      return;
     }
     // avoid ex: "-2-3" and "2-34"
     bool minusErrorUsing = (editString.find_first_of(L'-') != std::wstring::npos)
           || !editString.empty();
     if(Key == L'-' && minusErrorUsing)
     {
      Key = 0;
      return;
        }
     if(EditExit->Text.Length() > 5 && Key != L'\b')
     {
      Key = 0;
      return;
     }
     DoChange(Sender);
    }

    (C++) STL之 string 介紹

    既然使用C++,筆者建議非必要不要使用字元陣列來進行字串操作,因為字元陣列的長度一個問題!不像C++標準函式庫所提供的string類別,提供判斷自己是否為空字串,且不用擔心預設長度問題,在字串合併等操作也都非常容易實現,而陣列也不能直接指定給另一個陣列,所以您無法直接將字串指定給另一個字串,您也無法對兩個字串直接進行串連的動作,例如:


    #include < iostream >

    #include < string >
    int main()
    {
      std::string str1;
      std::string str2("Hello");
      std::string str3(str2);

      // 判斷是否為空字串
      if(str1.empty())
      {
         std::cout << "str1 為空字串" << std::endl;
      }

      // 字串合併
      str1 = str2 + str3;
      std::cout << str1 << std::endl;

      return 0;
    }

    (C++) C-style 字串

    C語言中字串是由字元所組成的陣列,字串的名子本身是一個pointer,字串以'\0'字元結尾,有兩種可行的宣告方式:


    方式一:
    char str[] = {'H', 'e', 'l', 'l', 'o', '\0'};


    方式二:
    char str[] = "Hello"; (程式會自動加上空字元 '\0')



    範例:

    #include < iostream >

    int main( )
    {
        char str[] = "Hello";

        for(int i = 0; i < (sizeof(str)/sizeof(str[0])); ++i)
       {
         if(str[i] == '\0') 
            cout << " null";
        else
           cout << " " << str[i];
       }
      return 0;
    }

    判斷string是否為number

    bool IsNumber(const std::wstring& str)
    {
       if ( str.empty() )
          return false;
      
       int pos = 0;
      
       if ( str[0] == _T('-') && str.length() >= 2)
          pos = 1;
       return (str[pos] >= _T('0') && str[pos] <= _T('9'));
    }

    2013年5月6日 星期一

    (C++) stringstream介紹

    如果想將 int 轉成 string,
    傳統C的作法如下:

    int a = 10;
    wchat_t wstr = [1024];
    wsprintf(wstr, L"%d", a);

    以上做法有兩點需要注意,
    1. 格式 類型(%d)
    2. Buffer大小

    格式類型給錯,
    會造成不可預期的錯誤,
    Buffer大小,
    太大 不經濟,
    太小 那就糟了。

    可以用stringstream來解決,
    有istringstream、ostringstream及stringsteam,
    分別對應輸入、輸出及輸出+輸入,
    用例子說明最快:

    #include
    #include
    #include

    int main( )
    {
       int a = 10;
       std::wstring wstr;
       std::wstringstream wstream;

       wstream << a;
       wstream >> wstr;
    }


    (C++) 將Debug資訊印出來 - 數字篇

    #include

    int main( )
    {

    int a = 10;
    wchar_t str[50];

    wsprintf(str, L"%d", a);

    OutputDebugString(str);
    }

    2013年5月2日 星期四

    重構 BMI program (Android)

    package com.example.test;

    import java.text.DecimalFormat;
    import android.os.Bundle;
    import android.app.Activity;
    import android.view.Menu;
    import android.view.View;
    import android.util.Log;
    import android.widget.Button;
    import android.widget.TextView;
    import android.widget.EditText;


    public class MainActivity extends Activity {
    private static String TAG = "test";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.d(TAG, "onCreate");

    findViews();
    setListener();
    }

    private Button button_calculate;
    private EditText field_height;
    private EditText field_weight;
    private TextView view_result;
    private TextView view_advice;

    private void findViews()
    {
    button_calculate = (Button)findViewById(R.id.submit);
    field_height = (EditText)findViewById(R.id.Height);
    field_weight = (EditText)findViewById(R.id.Weight);
    view_result = (TextView)findViewById(R.id.result);
    view_advice = (TextView)findViewById(R.id.advice);
    }

    private void setListener()
    {
    button_calculate.setOnClickListener(calculateBMI);
    }

    private Button.OnClickListener calculateBMI = new Button.OnClickListener()
    {
    public void onClick(View arg0) {

    double height = Double.parseDouble(field_height.getText().toString()) / 100;
    double weight = Double.parseDouble(field_weight.getText().toString());
    double result = weight / (height * height);
    DecimalFormat df = new DecimalFormat("0.00");
    view_result.setText(getText(R.string.bmi_result) + df.format(result));

    if(result > 25)
    {
    view_advice.setText(R.string.advice_heavy);
    }

    else if(result < 20)
    {
    view_advice.setText(R.string.advice_light);
    }

    else
    {
    view_advice.setText(R.string.advice_well);
    }
    }
    };

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
    }
    }

    計算BMI (Android)

    package com.example.test;

    import java.text.DecimalFormat;
    import android.os.Bundle;
    import android.app.Activity;
    import android.view.Menu;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.util.Log;
    import android.widget.Button;
    import android.widget.TextView;
    import android.widget.EditText;
    public class MainActivity extends Activity {

    private static String TAG = "test";

    @Override
    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.d(TAG, "onCreate");

    Button submitButton = (Button)findViewById(R.id.submit);
    submitButton.setOnClickListener(calculateBMI);
    }



    private OnClickListener calculateBMI = new OnClickListener()
    {
       public void onClick(View v)
       {
          EditText height = (EditText)findViewById(R.id.Height);
          EditText weight = (EditText)findViewById(R.id.Weight);
          double heightValue = Double.parseDouble(height.getText().toString()) / 100;
          double weightValue = Double.parseDouble(weight.getText().toString());
          double bmi = weightValue / (heightValue * heightValue);
          DecimalFormat df = new DecimalFormat("0.00");
          TextView result = (TextView)findViewById(R.id.result);
          result.setText("Your BMI is " + df.format(bmi));

          TextView advice = (TextView)findViewById(R.id.advice);
          if(bmi > 25)
          {
                advice.setText(R.string.advice_heavy);
          }
          else if(bmi < 20)
          {
                advice.setText(R.string.advice_light);
          }
          else
          {
                advice.setText(R.string.advice_well);
          }
    }
    };

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
    }
    }

    Android 生命週期

    package com.example.test;

    import android.os.Bundle;
    import android.app.Activity;
    import android.view.Menu;
    import android.util.Log;


    public class MainActivity extends Activity {
    private static String TAG = "test";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       Log.d(TAG, "onCreate");
    }
    public void onStop()
    {
       super.onStop();
       Log.d(TAG, "onStop");
    }

    public void onResume()
    {
       super.onResume();
       Log.d(TAG, "onResume");
    }

    public void onPause()
    {
       super.onPause();
       Log.d(TAG, "onPause");
    }

    public void onStart()
    {
       super.onStart();
       Log.d(TAG, "onStart");
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

    // Inflate the menu; this adds items to the action bar if it is present.

    getMenuInflater().inflate(R.menu.main, menu);

    return true;
    }
    }

    2013年5月1日 星期三

    string 和 wstring 互相轉換,適用於ASCII編碼

    #include < iostream >
    #include < string >
    using namespace std;
    int main(void)
    {
     // -----------------------------------------------------------------
     // 1. string to wstring
     // -----------------------------------------------------------------
     // 不適用其他非ASCII編碼(1 byte)的字元,如Unicode編碼(2 bytes)之中文
     string str1 = "abc";

     wstring wstr1;
     wstr1.assign(str1.begin(), str1.end());
     // or
     // wstring wstr1(str1.begin(), str1.end());
     wcout << wstr1 << endl;
     // -----------------------------------------------------------------
     // 2. wstring to string
     // -----------------------------------------------------------------
     wstring  wstr2 = L"abc";
     string str2(wstr2.begin(), wstr2.end());
     // or
     //str2.assign(wstr2.begin(), wstr2.end());
     cout << str2 << endl;
    }

    如何替換字串中的字元(C++)

    #include < string >

    int main(void)
    {
     std::wstring name = L"abc-def\\xyz";
     int position = name.find(L"\\");
     while(position != name.npos)
     {
      name.replace(position, 1, L"-");
      position = name.find(L"\\", position + 1);
     }
    }