2010年12月24日 星期五

Android EditText的輸入事件

關於Android的EditText的輸入事件,一開始我以為是用OnKeyListener去處理就可以了。
後來發現我錯了...OnKeyListener只接收"實體鍵盤的event觸發"對一般Android都是觸控的虛擬鍵盤一點反應都沒有。Google後發現應該是要用addTextChangedListener來處理才是正確的做法
程式大致如下:

myEditText.addTextChangedListener(new TextWatcher(){
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,int after) {
// TODO Auto-generated method stub
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub

}});

裡面三個function是new TextWatcher()必須要實作的
程式寫在onTextChange()那function裡面就可以了

2010年12月14日 星期二

Yahoo 搜尋股票代號API

在輸入股票代號時常常會不知道公司的股票代號
這時就可以用Yahoo 的這個API來搜尋

使用方式如下
http://d.yimg.com/autoc.finance.yahoo.com/autoc?query=關鍵字&callback=YAHOO.Finance.SymbolSuggest.ssCallback

此API可以尋找各交易所的股票代號相當的方便
但因為資料都是英文所以要搜尋中文公司也要輸入英文的關鍵字才行

用關鍵字Yahoo搜尋的結果如下
YAHOO.Finance.SymbolSuggest.ssCallback({"ResultSet":{"Query":"yahoo","Result":[{"symbol":"YHOO","name": "Yahoo! Inc.","exch": "NMS","type": "S","exchDisp":"NASDAQ","typeDisp":"Equity"},{"symbol":"YOJ.F","name": "YAHOO JAPAN","exch": "FRA","type": "S","exchDisp":"Frankfurt","typeDisp":"Equity"},{"symbol":"YOJ.BE","name": "YAHOO JAPAN","exch": "BER","type": "S","exchDisp":"Berlin","typeDisp":"Equity"},{"symbol":"YHO.MU","name": "YAHOO","exch": "MUN","type": "S","exchDisp":"Munich","typeDisp":"Equity"},{"symbol":"YHO.F","name": "YAHOO","exch": "FRA","type": "S","exchDisp":"Frankfurt","typeDisp":"Equity"},{"symbol":"YAHOF.PK","name": "YAHOO JAPAN CORP","exch": "PNK","type": "S","exchDisp":"Pink Sheets","typeDisp":"Equity"},{"symbol":"ETD","name": "Citigroup Inc. ELKS On Yahoo","exch": "PCX","type": "S","typeDisp":"Equity"},{"symbol":"YHO.DU","name": "YAHOO","exch": "DUS","type": "S","exchDisp":"Dusseldorf Stock Exchange","typeDisp":"Equity"},{"symbol":"YOJ.DE","name": "YAHOO JAPAN","exch": "GER","type": "S","exchDisp":"XETRA","typeDisp":"Equity"},{"symbol":"YHO.HM","name": "YAHOO","exch": "HAM","type": "S","exchDisp":"Hamburg","typeDisp":"Equity"}]}})

和Google Stock Api一樣...也是JSON格式
symbol = 代號
name = 公司名稱
exch = 證券交易所
type = 應該是上市上櫃分別
exchDisp = 交易所地點

參考自
http://stackoverflow.com/questions/885456/stock-ticker-symbol-lookup-api&rurl=translate.google.com.tw&twu=1&usg=ALkJrhgoUpKv7sDtcpKatP_oy50z7GI2Jg

2010年12月2日 星期四

Android Http Get 實作範例

首先
在AndroidManifest.xml中要加入可以使用網路的權限
< uses-permission android:name="android.permission.INTERNET" >< /uses-permission >

在程式部份

//for Http Get
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;


public void executeHttpGet() throws Exception {
try {
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(網址);
HttpResponse response = client.execute(request);
String retSrc = EntityUtils.toString(response.getEntity());

System.out.println(retSrc);
} finally {
}
}

Android SharedPreferences 儲存簡單的欄位資訊

Android 提供了 SharedPreferences 這個介面讓我們方便存取一些預設資料或是一些簡單的使用者輸入的欄位資訊
要使用這個介面第一步當然是
import android.content.SharedPreferences;

接著,就是程式碼的部份

首先介紹儲存資料的部份
//取得SharedPreferences物件 (參數一是偏好設定檔的名稱,參數二是讀取權限)
SharedPreferences pref = getSharedPreferences("PREF_STOCK", MODE_WORLD_WRITEABLE);
//要修改偏好設定檔必須透過一個SharedPreferences.Editor 物件
//取得SharedPreferences.Editor 物件
SharedPreferences.Editor prefEdt = pref.edit();
//寫入資料(參數一是欄位名稱,參數二是要寫入的資料)
prefEdt.putString("PREF_T", "hello world");
//最後一定要commit將資料寫入檔案
prefEdt.commit();


在讀取方面就簡單多了

//取得SharedPreferences物件 (參數一是偏好設定檔的名稱,參數二是讀取權限)
SharedPreferences pref = getSharedPreferences("PREF_STOCK", MODE_WORLD_WRITEABLE);
//取得資料 (參數一是欄位名稱,參數二是讀取失敗時的預設資料)
String getS = pref.getString("PREF_T", "");


以上就是讀寫一個偏好設定檔要用的功能了
其他更深入的說明介紹可以參考以下的資料
http://asia.edu.tw/~lincyu/Android/Chapter11.pdf

http://developer.android.com/reference/android/content/SharedPreferences.html

Android 讀取JSON使用範例

在Android中使用JSON其實滿方便的,因為Libary已經有寫好了,只要直接拿來用就好了
首先

import org.json.JSONObject;
import org.json.JSONArray;

然後假設JSON格式的資料在一個字串json_data中
如果資料最外層是[]那就是JSONArray
最外層是{}則是JSONObject

以上一篇從Google取得的股票資料為例
最外層是[]然後裡面有不同的物件
取得資料方式如下

//將資料寫入JSONArray
JSONArray result = new JSONArray(json_data);
//取出陣列內所有物件
for(int i = 0;i < result.length(); i++)
{
//取出JSON物件
JSONObject stock_data = result.getJSONObject(i);
//取得物件內資料
System.out.println("t:"+stock_data.getString("t"));
System.out.println("l_cur:"+stock_data.getString("l_cur"));
System.out.println("c:"+stock_data.getString("c"));
System.out.println("cp:"+stock_data.getString("cp"));
}



可參考API網址
http://developer.android.com/reference/org/json/package-summary.html

2010年12月1日 星期三

Google Stock 股市API

跟據
http://googlefinanceblog.blogspot.com/2008/04/taiwan-stock-exchange-pricing-data.html
可以得知在2008Google的Stock API就已經有台灣股市的資料了使用方式就是把後面改成
TPE:代號 或是 代號.TW

查詢方式如下:(以2454聯發科)為例
http://finance.google.com/finance/info?client=ig&q=TPE:2454

得到的結果
// [ { "id": "683538" ,"t" : "2454" ,"e" : "TPE" ,"l" : "391.50" ,"l_cur" : "NT$391.50" ,"ltt":"1:30PM Taipei" ,"lt" : "Dec 1, 1:30PM Taipei" ,"c" : "+1.00" ,"cp" : "0.26" ,"ccol" : "chg" } ]

看得出來是個JSON格式的file
t就是代號
"l_cur":成交價格
"ltt":時間
"lt":日期時間
"c":漲跌
"cp":漲跌幅


其他資訊可以參考
http://stackoverflow.com/questions/527703/google-financial-api-how-get-stock-quotes

Google Finance API docs
http://code.google.com/intl/zh-TW/apis/finance/docs/2.0/reference.html