多國語言的開發 以下網址介紹的很好
介紹給大家
JacobTsai's Blog
2010年8月5日 星期四
Android AlertDialog 教學(上)
AlertDialog(對話方塊)
很像是Android 的 MessageBox ,不過其實他的功能比windows上的 MessageBox 還要強大,且動作上不太相同。
1.windows的 MessageBox 只能顯示訊息,可以設定按鈕數量,
Android 的 AlertDialog 可以顯示訊息,還可以顯示列表,甚至可以是一個xml
也就是說,可以在layout編輯器裡新增一個表單(XML),裡可以放文字物件,EDITTEXT物件,按鈕物件,然後於AlertDialog 上顯示出來,也可以是或是選單(單選,複選都可)。
2.Windows上的MessageBox 是"阻塞"特性,就是當MessageBox 沒有被按下確定或是取消按鈕,程式不會繼續往下執行。
Android 的 AlertDialog 只是單存的對話方塊跳出來,程式會繼續往下執行,這裡還需注意。
1.先來依個最簡單的 對話方塊(AlertDialog)
程式碼如下
private void ShowAlertDialog()
{
Builder MyAlertDialog = new AlertDialog.Builder(this);
MyAlertDialog.setTitle("標題");
MyAlertDialog.setMessage("我是內容");
MyAlertDialog.show();
}
新增一個按鈕,加入可以更動訊息,讓這個對話方塊更好用
使用方法
ShowMsgDialog("哈哈哈");
private void ShowMsgDialog(String Msg)
{
Builder MyAlertDialog = new AlertDialog.Builder(this);
MyAlertDialog.setTitle("標題");
MyAlertDialog.setMessage(Msg);
DialogInterface.OnClickListener OkClick = new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int which) {
//如果不做任何事情 就會直接關閉 對話方塊
}
};;
MyAlertDialog.setNeutralButton("中間按鈕",OkClick );
MyAlertDialog.show();
}
然而按鈕可以分成左邊,中間,右邊 來使用,
OkClick是按下時候處理的事件,因為示範所以只寫
OkClick
,實際上需要三個事件對應三個按鈕
//三個按鈕的對話方塊展示
private void ShowAlertDialogAnd3Button()
{
Builder MyAlertDialog = new AlertDialog.Builder(this);
MyAlertDialog.setTitle("標題");
MyAlertDialog.setMessage("我是內容");
//建立按下按鈕
DialogInterface.OnClickListener OkClick = new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int which) {
//如果不做任何事情 就會直接關閉 對話方塊
}
};
MyAlertDialog.setPositiveButton("左邊按鈕",OkClick );
MyAlertDialog.setNeutralButton("中間按鈕",OkClick );
MyAlertDialog.setNegativeButton("右邊按鈕",OkClick );
MyAlertDialog.show();
}
對話方塊還可以使用LIST選單,以下示範單選
//有選單的對話方塊
final String[] ListStr = {"Android","其實","很簡單","且","如果選擇項目太多","Android也會","自動的可以拖曳喔!~","真好用"};
private void ShowAlertDialogAndList()
{
Builder MyAlertDialog = new AlertDialog.Builder(this);
MyAlertDialog.setTitle("標題");
//建立選擇的事件
DialogInterface.OnClickListener ListClick = new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int which) {
ShowMsgDialog(ListStr[which]);
}
};
//建立按下取消什麼事情都不做的事件
DialogInterface.OnClickListener OkClick = new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int which) {
}
};
MyAlertDialog.setItems(ListStr, ListClick);
MyAlertDialog.setNeutralButton("取消",OkClick );
MyAlertDialog.show();
}
標籤:
教學,
AlertDialog,
Android
2010年7月16日 星期五
關於ListView
這裡有一篇好文章,http://www.javaeye.com/topic/540423
寫慣了windows上的程式,一直以為ListView是一個物件,
研究之後發現他比較像是一個佈局,這個佈局裡可以存放各式樣的XML
所以MARKET是ListView,YOUTUBE DOWNLOADER也是ListView的使用,很難想像它們相同ListView
所以ListView也不會太簡單的讓我想加文字就像windows這樣隨便加,
詳細的狀況等我學會一點再來心得分享一番。
寫慣了windows上的程式,一直以為ListView是一個物件,
研究之後發現他比較像是一個佈局,這個佈局裡可以存放各式樣的XML
所以MARKET是ListView,YOUTUBE DOWNLOADER也是ListView的使用,很難想像它們相同ListView
所以ListView也不會太簡單的讓我想加文字就像windows這樣隨便加,
詳細的狀況等我學會一點再來心得分享一番。
2010年7月14日 星期三
Android軟體生命週期
Android 主要是使用在手機上,所以應用程式必須要對於程式中斷做出相對應的政策,才是好的程式,要不然電話一來,程式就當機,或是引響到手機通話功能,最糟的是,當程式離開了,還有一個無窮回圈一值在背景執行,導致手機很快就沒電,這樣的設計都是很不好的。
所以了解Android的生命週期很重要,我想要以CASE的方式介紹生命週期
了解生命週期之前必須先了解Android 並不會關閉程式,執行程式的時候中途按下 BACK 或是 MENU離開程式回到桌面時,程式依然會保留在記憶體內沒有被釋放,所以才會有task kill 這類程式來強制關閉應用程式。
心法:
畫面失去焦點 啟動pause 回到焦點 resume
畫面被蓋掉 啟動 Stop 畫面回來 START
1.當程式啟動的時候執行三個流程
OnCreat->OnStart -> OnResume
2.這時候按下Back 回到畫面 執行三個流程
OnPaus-->OnStop -->OnDestory
3.啟動另外一個ACTIVE
舊Active pause --> 新Active on Creat --> 新Active onStart --> 新Active onResume 舊Active Stop
4.程式執行時按下電源鈕讓手機進入休眠
Active pause
5.程式由休眠再度打開電源
Active Resume
6.程式執行時電話來了
Active onPause-->Active OnStop
8.接聽後掛掉電話
ReStart -->Start-->Resume
9.手機簡訊來了
不會暫停程式
10.手機撥來只響一聲就掛掉
Active onPause--> Resume
11螢幕切換橫向縱向,基本上會先強制關閉程式,然後再度讀取所以會
onPause-->OnStop-->OnDestory-->OnCreat->OnStart -> OnResume
值得注意的是
onStop OnPause 程式的所有變數與物件都沒有被釋放,
都還是保持原來的這還好處理。
有時候程式裡會有兩三個Active 切換的時候會呼叫OnCreat
當 OnCreat的時候可怕的事情發生了,所有變數都回復到預設值,
雖然他並沒有被OnDestory但是他被OnCreat了,
所有的變數重新再度被定義為初始狀態,這是值得注意的。
所以了解Android的生命週期很重要,我想要以CASE的方式介紹生命週期
了解生命週期之前必須先了解Android 並不會關閉程式,執行程式的時候中途按下 BACK 或是 MENU離開程式回到桌面時,程式依然會保留在記憶體內沒有被釋放,所以才會有task kill 這類程式來強制關閉應用程式。
心法:
畫面失去焦點 啟動pause 回到焦點 resume
畫面被蓋掉 啟動 Stop 畫面回來 START
1.當程式啟動的時候執行三個流程
OnCreat->OnStart -> OnResume
2.這時候按下Back 回到畫面 執行三個流程
OnPaus-->OnStop -->OnDestory
3.啟動另外一個ACTIVE
舊Active pause --> 新Active on Creat --> 新Active onStart --> 新Active onResume 舊Active Stop
4.程式執行時按下電源鈕讓手機進入休眠
Active pause
5.程式由休眠再度打開電源
Active Resume
6.程式執行時電話來了
Active onPause-->Active OnStop
8.接聽後掛掉電話
ReStart -->Start-->Resume
9.手機簡訊來了
不會暫停程式
10.手機撥來只響一聲就掛掉
Active onPause--> Resume
11螢幕切換橫向縱向,基本上會先強制關閉程式,然後再度讀取所以會
onPause-->OnStop-->OnDestory-->OnCreat->OnStart -> OnResume
值得注意的是
onStop OnPause 程式的所有變數與物件都沒有被釋放,
都還是保持原來的這還好處理。
有時候程式裡會有兩三個Active 切換的時候會呼叫OnCreat
當 OnCreat的時候可怕的事情發生了,所有變數都回復到預設值,
雖然他並沒有被OnDestory但是他被OnCreat了,
所有的變數重新再度被定義為初始狀態,這是值得注意的。
2010年7月2日 星期五
Android 動態的增加物件以按鈕為例子
寫了一範例
這個範例 一開始有一個按鈕, 按一下新增一個按鈕
按下新的按鈕則顯示誰被按了
歡迎來我的部落格
這個範例 一開始有一個按鈕, 按一下新增一個按鈕
按下新的按鈕則顯示誰被按了
歡迎來我的部落格
1 | import android.app.Activity; |
標籤:
物件,
按鈕,
Android.動態
2010年6月23日 星期三
關於介面與執行序Only the original thread that created a view hierarchy can touch its views.
Android 是一個多功多執行的作業系統,雖然可以多執行緒
但是遵循著mvc模式 ,所以當非UI的執行序,嘗試去改變ui介面的程式就會出現錯誤而關閉程式
例如
寫了一個遊戲,遊戲的核心是一個執行緒,定期需要計算遊戲的內容,且需要定時的更新畫面,然而跟跟新畫面,需要呼叫 invalidate 這個方法,偏偏這個方法使會變更介面,所以android只好把你強迫關閉程式。告訴你Only the original thread that created a view hierarchy can touch its views
最簡單的方法就是不要使用 invalidate 改用 postInvalidate();
但只是剛好invalidate 有 postInvalidate(); 可以幫助更新畫面,但是如果要更變tTextBox內容,或是 setContentView(view); 那可就沒那麼幸運了。
事實上這樣龜毛的規則並不是Android訂製的,c#的開發使用者也是有著相同的困腦,
但在c# 會使用委派來將 要改變介面的事情 透過委派 交給 UI的執行序去執行。
然而在Android 使用了比較值覺得寫法
runOnUiThread(new Runnable(){
public void run() {
//要改變介面的程式寫在這裡
}});
這樣android就會裡面的程式碼,改由ui的執行序來執行,而不會出錯了,
所以類推本來寫postInvalidate(); 可以改寫成
runOnUiThread(new Runnable(){
public void run() {
invalidate
}});
通常錯誤如下:
06-23 15:47:40.123: ERROR/AndroidRuntime(393): Uncaught handler: thread Thread-10 exiting due to uncaught exception
06-23 15:47:40.135: ERROR/AndroidRuntime(393): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
但是遵循著mvc模式 ,所以當非UI的執行序,嘗試去改變ui介面的程式就會出現錯誤而關閉程式
例如
寫了一個遊戲,遊戲的核心是一個執行緒,定期需要計算遊戲的內容,且需要定時的更新畫面,然而跟跟新畫面,需要呼叫 invalidate 這個方法,偏偏這個方法使會變更介面,所以android只好把你強迫關閉程式。告訴你Only the original thread that created a view hierarchy can touch its views
最簡單的方法就是不要使用 invalidate 改用 postInvalidate();
但只是剛好invalidate 有 postInvalidate(); 可以幫助更新畫面,但是如果要更變tTextBox內容,或是 setContentView(view); 那可就沒那麼幸運了。
事實上這樣龜毛的規則並不是Android訂製的,c#的開發使用者也是有著相同的困腦,
但在c# 會使用委派來將 要改變介面的事情 透過委派 交給 UI的執行序去執行。
然而在Android 使用了比較值覺得寫法
runOnUiThread(new Runnable(){
public void run() {
//要改變介面的程式寫在這裡
}});
這樣android就會裡面的程式碼,改由ui的執行序來執行,而不會出錯了,
所以類推本來寫postInvalidate(); 可以改寫成
runOnUiThread(new Runnable(){
public void run() {
invalidate
}});
通常錯誤如下:
06-23 15:47:40.123: ERROR/AndroidRuntime(393): Uncaught handler: thread Thread-10 exiting due to uncaught exception
06-23 15:47:40.135: ERROR/AndroidRuntime(393): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
2010年6月19日 星期六
Android 多點觸控
Android 的多點觸控以現在的api來看 最多3點觸控
於程式中加入
@Override
public boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
}
即可抓取觸控的座標以及事件
x[0] = (int) event.getX(0); //單點觸控的座標
y[0] = (int) event.getY(0);
x[1] = (int) event.getX(1); //第二點觸控的座標
y[1] = (int) event.getY(1);
x[2] = (int) event.getX(2);//第三點觸控的座標
y[2] = (int) event.getY(2);
可惜的是我拿得是 DESIRE 最多兩點觸控,第三點是沒有作用的,且有交叉誤判的現象
抓取事件
if (event.getAction() == MotionEvent.ACTION_MOVE )
{
這個事件在模擬與實機有很大的出入,模擬器只會移動一下觸發一次,而實機摸下去之後不管有沒有移動 都會瘋狂的觸發。
}
if (event.getAction() == MotionEvent.ACTION_DOWN )
{
指尖按下
}
if (event.getAction() == MotionEvent.ACTION_OUTSIDE )
if (event.getAction() == MotionEvent.ACTION_POINTER_1_DOWN )
基本上 如果使用了 MotionEvent.ACTION_DOWN 這個事件永遠不會觸發
if (event.getAction() == MotionEvent.ACTION_POINTER_2_DOWN )
第二點按下
if (event.getAction() == MotionEvent.ACTION_POINTER_3_DOWN )
{
第三點按下
}
if (event.getAction() == MotionEvent.ACTION_POINTER_3_UP )
{
第三點放開 兩點觸控的 也不會產生這個事件
}
好了看完很多疑問,為什麼point 1 23 的 move
兩點原因
1.不管是哪個點移動 都是觸發 move 旗標
2.按下去之後就瘋狂觸發所以乾脆三點都檢查
move up 1 2
要由一系列動作解釋
按下第一鍵
觸發 down
按下第二鍵
觸發 point 2 down
放開第二鍵 觸發
觸發 point 2 up
放開第一鍵 觸發 up (注意不是point 1 up)
再次實驗
按下第一鍵
觸發 down
按下第二鍵
觸發 point 2 down
放開第一鍵 觸發
觸發 point 1 up
這時候 本來的point 2 變成point 1 座標 也變成由point 1取得雖然他應該是第二鍵
放開第一鍵 觸發 up (注意不是point 2 up)
於程式中加入
@Override
public boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
}
即可抓取觸控的座標以及事件
x[0] = (int) event.getX(0); //單點觸控的座標
y[0] = (int) event.getY(0);
x[1] = (int) event.getX(1); //第二點觸控的座標
y[1] = (int) event.getY(1);
x[2] = (int) event.getX(2);//第三點觸控的座標
y[2] = (int) event.getY(2);
可惜的是我拿得是 DESIRE 最多兩點觸控,第三點是沒有作用的,且有交叉誤判的現象
抓取事件
if (event.getAction() == MotionEvent.ACTION_MOVE )
{
這個事件在模擬與實機有很大的出入,模擬器只會移動一下觸發一次,而實機摸下去之後不管有沒有移動 都會瘋狂的觸發。
}
if (event.getAction() == MotionEvent.ACTION_DOWN )
{
指尖按下
}
if (event.getAction() == MotionEvent.ACTION_OUTSIDE )
if (event.getAction() == MotionEvent.ACTION_POINTER_1_DOWN )
基本上 如果使用了 MotionEvent.ACTION_DOWN 這個事件永遠不會觸發
if (event.getAction() == MotionEvent.ACTION_POINTER_2_DOWN )
第二點按下
if (event.getAction() == MotionEvent.ACTION_POINTER_3_DOWN )
{
第三點按下
}
if (event.getAction() == MotionEvent.ACTION_POINTER_3_UP )
{
第三點放開 兩點觸控的 也不會產生這個事件
}
好了看完很多疑問,為什麼point 1 23 的 move
兩點原因
1.不管是哪個點移動 都是觸發 move 旗標
2.按下去之後就瘋狂觸發所以乾脆三點都檢查
move up 1 2
要由一系列動作解釋
按下第一鍵
觸發 down
按下第二鍵
觸發 point 2 down
放開第二鍵 觸發
觸發 point 2 up
放開第一鍵 觸發 up (注意不是point 1 up)
再次實驗
按下第一鍵
觸發 down
按下第二鍵
觸發 point 2 down
放開第一鍵 觸發
觸發 point 1 up
這時候 本來的point 2 變成point 1 座標 也變成由point 1取得雖然他應該是第二鍵
放開第一鍵 觸發 up (注意不是point 2 up)
訂閱:
文章 (Atom)
