Android手機應用開發------基礎的事件處理
實驗目的:
- 瞭解
Android
程式設計基礎。- 熟悉
Button
、RadioButton
、EditText
等基本控制元件,能夠處理這些控制元件的基本事件。- 學會彈出對話方塊,並定製對話方塊中的內容,能對確定和取消按鈕的事件做處理。
- 1.首先要知道在哪裡新增事件程式碼
- 2.還需要分析一下這個
java
檔案的結構
在OnCreate
方法裡面建立了一個savedInstanceState
,還把它的View
設定為上次的佈局activity_main
,這都不重要,總是,把填寫的事件應該放在onCreate
裡面,不然就無法被呼叫,如果覺得放的太亂了,也可以新建一個自己的事件方法,然後在onCreate
- 3.然後需要解決下面的一些問題
如何獲取EditText
中的值
final EditText editText = (EditText)findViewById(R.id.edit_text);
String text = editText.getText().toString();
這裡是通過EditText
的id
找到它,但是需要宣告為final
,不然會報錯說內部類的變數應該定義為final
如何獲取選中的RadioButton
的值
final RadioGroup radioGroup = (RadioGroup)findViewById(R.id. rg);
String text = ((RadioButton)findViewById(radioGroup.getCheckedRadioButtonId())).getText();
這裡同樣也是通過id
找到該值,不需要呼叫toString
方法
如何新增按鈕事件
final Button btn = (Button) findViewById(R.id.button);
if(btn != null){
btn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view){
//新增一些事件
}
});
}
這裡是通過直接在java
程式碼裡新增監聽器以及onClick
方法
還有一種方式是在xml裡新增按鈕的onClick
屬性,然後指向自己寫的onClick
方法(當然名稱可以變),如下圖
如何彈出Toast
資訊
//單選按鈕更改事件
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override public void onCheckedChanged(RadioGroup group, int checkedId) {
Toast.makeText(getApplicationContext(),((RadioButton)findViewById(radioGroup.getCheckedRadioButtonId())).getText() + "被選中",Toast.LENGTH_SHORT).show();
} });
這裡實現的是改變RadioGroup
中選中的按鈕觸發的事件,像新增按鈕事件一樣
然後裡面實現了點選不同的RadioButton
彈出不同的Toast
提示“XXX被選中”
如何彈出對話方塊AlertDialog
final AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this);
alertDialog.setTitle("提示").setMessage(message).setPositiveButton("確認",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getApplicationContext(),"對話方塊“確定”按鈕被點選",Toast.LENGTH_SHORT).show();
}
}).setNegativeButton("取消",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getApplicationContext(),"對話方塊“取消”按鈕被點選",Toast.LENGTH_SHORT).show();
}
}).create().show();
主要需要實先setTitle
,setMessage
,setPositiveButton
,setNegativeButton
在這個裡面還實現了點選兩個不同按鈕彈出不同Toast提示的事件
重點:如何根據不同情況彈出不同的對話方塊AlertDialog
也許這個最終實現起來程式碼很簡單,但是我的想法確實有點曲折
要求:
- 如果搜尋內容為空,彈出
Toast
資訊“搜尋內容不能為空”。- 如果搜尋內容為“Health”,根據選中的
RadioButton
項彈出資訊“xxx搜尋成功”,xxx是RadioButton
選中的內容- 其他情況,彈出“搜尋失敗”
思路一:
我先建立好AlertDialog
,然後再呼叫``setMessage(message)`來適應不同情況下的提示訊息
結果:失敗!
因為AlertDialog
一但建立好就是final
的不會改變,後來是改變不了的,所以效果就是一直彈出的知識最開始設定的訊息
另外,也不要想建立的時候用String
傳值給setMessage
,然後改變這個String
就好了,我試過了,不可以!
思路二:
得到這個部落格Android AlertDialog 動態更新裡面的ListView資料的啟發,想用ListView
來儲存訊息,但是容量只有一個,AlertDialog
中的樣式由自定義的xml
確定,裡面當然就是ListView
了,每次需要呼叫AlertDialog
的時候就把容器裡面唯一的訊息彈出來,把需要的訊息放進去,就可以改變訊息了
結果:或許能成功,但太過麻煩
為什麼說或許能成功呢,反正我是失敗了,而且即使把上面老哥的程式碼跑一遍也還是失敗了,失敗的標誌就是程式閃退:停止執行,但是理論上我覺得是可行的,只是暫時還是不會正確使用ListView
和AlertDIalog
……
不過這個方法確實太麻煩了,還要定義容器,設定``ArrayAdapter
等等,有點大材小用的感覺
思路三:
本來是最容易想到的,但卻是我最後想到的!
為什麼非要改變那個建立好的AlertDialog
呢,就不能建立不同的幾個嗎?
所以啊,只要在按鈕點選事件onClick
裡面建立AlertDialog
而不是放在此方法外面當一個類成員就好了嗎,真的是笨!
emmm,不知道有沒有人能想到另一種實現:我先在類裡面建立好所有的
AlertDialog
,然後根據需要呼叫就好了,肯定可以!只是浪費資源,程式碼冗長。
結果:成功!
最後實現的程式碼就是這樣子
//訊息提示
String message = new String("查詢失敗");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
event();
}
public void event(){
//獲取輸入文字
final EditText editText = (EditText)findViewById(R.id.edit_text);
//獲取單選內容
final RadioGroup radioGroup = (RadioGroup)findViewById(R.id.rg);
//按鈕點選事件
final Button btn = (Button) findViewById(R.id.button);
if(btn != null){
btn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view){
message = (editText.getText().toString().isEmpty() ? "搜尋內容不能為空" :
(editText.getText().toString().equals("Health") ?((RadioButton)findViewById(radioGroup.getCheckedRadioButtonId())).getText() + "搜尋成功": "搜尋失敗"));
//對話方塊
final AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this);
alertDialog.setTitle("提示").setMessage(message).setPositiveButton("確認",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getApplicationContext(),"對話方塊“確定”按鈕被點選",Toast.LENGTH_SHORT).show();
}
}).setNegativeButton("取消",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getApplicationContext(),"對話方塊“取消”按鈕被點選",Toast.LENGTH_SHORT).show();
}
}).create().show();
}
});
}
//單選按鈕更改事件
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override public void onCheckedChanged(RadioGroup group, int checkedId) {
Toast.makeText(getApplicationContext(),((RadioButton)findViewById(radioGroup.getCheckedRadioButtonId())).getText() + "被選中",Toast.LENGTH_SHORT).show();
} });
}