實驗目的:
- 瞭解
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();
} });
}