聲明:學習的書籍《Android應用開發揭秘》,這裡記錄學習該書籍的日誌,引用的相關代碼與總結描述,沒有商業的用途,完全是自我學習的一個記錄,剛剛學習不可避免會出現很多問題,若是有錯誤還請大家多多批評。
繼續基礎控制項的學習;
一、提示Toast控制項
該控制項在Android中,主要用於顯示資訊。比如:當退出程式時,用來提示玩家“需要更新”等資訊,在輸入框中輸入文本時,提示玩家“最多能輸入10字元”等。
執行個體分析:用顯示當收到簡訊息的時候,使用Toast控制項顯示傳送簡訊的內容。
【關注點】:1. Toast控制項的使用;2. 如何傳送簡訊並監控簡訊的收發。
【遇到問題】:
1. 在開啟模擬器運行程式時,報:emulator-5554 disconnected! Cancelling……錯誤。即串連不上模擬器
遇到這個問題,在google裡找了一下,主要由三個解決方案
1. emulator -avd -wipe-data
2. reset abd
3. restarting the eclipse again
解決方案1:【當前方法成功解決我的問題】
在eclipse裡面改變一下你run的時候的設定就好了.
右點你的工程後run裡面有一個run configrations,
在裡面有一個選項每次運行都檫掉記錄 wipe....的,選上就好了
emulator -wipe-data
或者選擇“wipe out user data”
該解決方案參考網上:http://ophone8.com/thread-4046-1-1.html
同樣;
http://androidforums.com/application-development/5398-android-help-emulator-5554-disconnected.html
First, close (or force close) your current AVD.
Open Android SDK and AVD Manager, choose your virtual device, click "Start..." then check the "wipe user data" mode then click "Launch".
問題出現原因,分析是手動關掉AVD以後出現的,AVD沒啟動完你就關掉了,當然出現“串連失敗”(disconnected!),然後就取消中....
執行個體重要源碼:
1. 若是想收發簡訊,必須建立一個繼承BroadcastReceiver的類,重寫其onReceive方法,當收到簡訊時就會觸發該方法。
public class SMSReceiver extends BroadcastReceiver {//收到簡訊時,就會觸發此方法public void onReceive(Context context, Intent intent) {/*Bundle:API中:A mapping from String values to various Parcelable types. * Bundle類用作攜帶資料,它類似於Map,用於存放key-value名值對形式的值。 * 相對於Map,它提供了各種常用類型的putXxx()/getXxx()方法,如:putString()/getString()和putInt()/getInt(), * putXxx()用於往Bundle對象放入資料,getXxx()方法用於從Bundle對象裡擷取資料。 * Bundle的內部實際上是使用了HashMap<String, Object>類型的變數來存放putXxx()方法放入的值: * 在調用Bundle對象的getXxx()方法時,方法內部會從該變數中擷取資料,然後對資料進行類型轉換,轉換成什麼類型由方法的Xxx決定,getXxx()方法會把轉換後的值返回。 */Bundle bundle = intent.getExtras();Object message[] = (Object[]) bundle.get("pdus");SmsMessage smsMessage[] = new SmsMessage[message.length];for(int n = 0;n < message.length; n++){smsMessage[n] = SmsMessage.createFromPdu((byte[]) message[n]);/* Create an SmsMessage from a raw PDU. SmsMessage類中該createFromPdu方法的源碼: public static SmsMessage createFromPdu(byte[] pdu) { SmsMessageBase wrappedMessage; int activePhone = TelephonyManager.getDefault().getPhoneType(); if (PHONE_TYPE_CDMA == activePhone) { wrappedMessage = com.android.internal.telephony.cdma.SmsMessage.createFromPdu(pdu); } else { wrappedMessage = com.android.internal.telephony.gsm.SmsMessage.createFromPdu(pdu); } return new SmsMessage(wrappedMessage); } */}//產生一個ToastToast toast = Toast.makeText(context, "簡訊內容:"+smsMessage[0].getMessageBody(), Toast.LENGTH_LONG);/* public String getMessageBody () Returns the message body as a String, if it exists and is text based. *///設定toast顯示的位置//toast.setGravity(Gravity.TOP|Gravity.LEFT, 0, 200);//顯示該Toasttoast.show();}
以上是專門用於處理簡訊接收的觸發類,但是需要配置成監聽服務
<uses-permission android:name="android.permission.RECEIVE_SMS"/> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:label="@string/app_name" android:name=".Examples_04_05Activity" > <intent-filter > <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:enabled="true" android:name="SMSReceiver"> <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED"/> </intent-filter> </receiver> </application>
程式在運行時,需要類比傳送簡訊,切換到DDMS模式,如:
運行效果如下:左圖為程式啟動效果,右圖為發送了簡訊之後的效果
一、編輯框EditText控制項
針對EditText控制項,可以為其設定事件監聽setOnKeyListener,並實現onKey方法,當使用者按鍵時便會觸發這個事件,從而可以通過getText()擷取控制項裡面的內容。
使用者沒有輸入資料的情況下,使用EditText.setHint(“請輸入帳號!”);來實現資訊的提示。
二、 單項選擇(RadioGroup,RadioButton)
要是實現一個選項按鈕組的效果,必須使用RadioGroup與RadioButton組合使用,如:
<RadioGroup android:id="@+id/RadioGroup01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:layout_x="3px" android:layout_y="54px" > <RadioButton android:id="@+id/RadioButton1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/RadioButton1" /> <RadioButton android:id="@+id/RadioButton2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/RadioButton2" /></RadioGroup>
介面上選擇按鈕由RadioButton來控制,選項按鈕組的答案由RadioGroup來控制,在定義RadioGroup時,在監聽RadioGroup的setOnCheckedChangeListener事件時:
/* 設定事件監聽 */m_RadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(RadioGroup group, int checkedId){// TODO Auto-generated method stubif (checkedId == m_Radio2.getId()){ DisplayToast("正確答案:" + m_Radio2.getText() + ",恭喜你,回答正確!");}else{DisplayToast("請注意,回答錯誤!");}});
今天學習到P69頁,繼續加油