1. 程式人生 > >Android手機應用開發------基礎的事件處理

Android手機應用開發------基礎的事件處理

實驗目的:

  1. 瞭解Android程式設計基礎。
  2. 熟悉ButtonRadioButtonEditText等基本控制元件,能夠處理這些控制元件的基本事件。
  3. 學會彈出對話方塊,並定製對話方塊中的內容,能對確定和取消按鈕的事件做處理。
  • 1.首先要知道在哪裡新增事件程式碼

1538462162249

  • 2.還需要分析一下這個java檔案的結構

1538462563325

OnCreate方法裡面建立了一個savedInstanceState,還把它的View設定為上次的佈局activity_main,這都不重要,總是,把填寫的事件應該放在onCreate裡面,不然就無法被呼叫,如果覺得放的太亂了,也可以新建一個自己的事件方法,然後在onCreate

裡面呼叫這個方法,記得要最後呼叫

  • 3.然後需要解決下面的一些問題

如何獲取EditText中的值

final EditText editText = (EditText)findViewById(R.id.edit_text);
String text = editText.getText().toString();

這裡是通過EditTextid找到它,但是需要宣告為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方法(當然名稱可以變),如下圖

1538463462290

如何彈出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();

主要需要實先setTitlesetMessagesetPositiveButtonsetNegativeButton

在這個裡面還實現了點選兩個不同按鈕彈出不同Toast提示的事件

重點:如何根據不同情況彈出不同的對話方塊AlertDialog

也許這個最終實現起來程式碼很簡單,但是我的想法確實有點曲折

要求:

  • 如果搜尋內容為空,彈出Toast資訊“搜尋內容不能為空”。
  • 如果搜尋內容為“Health”,根據選中的RadioButton項彈出資訊“xxx搜尋成功”,xxx是RadioButton選中的內容
  • 其他情況,彈出“搜尋失敗

思路一:

我先建立好AlertDialog,然後再呼叫``setMessage(message)`來適應不同情況下的提示訊息

結果:失敗!

因為AlertDialog一但建立好就是final的不會改變,後來是改變不了的,所以效果就是一直彈出的知識最開始設定的訊息

另外,也不要想建立的時候用String傳值給setMessage,然後改變這個String就好了,我試過了,不可以!

思路二:

得到這個部落格Android AlertDialog 動態更新裡面的ListView資料的啟發,想用ListView來儲存訊息,但是容量只有一個,AlertDialog中的樣式由自定義的xml確定,裡面當然就是ListView了,每次需要呼叫AlertDialog的時候就把容器裡面唯一的訊息彈出來,把需要的訊息放進去,就可以改變訊息了

結果:或許能成功,但太過麻煩

為什麼說或許能成功呢,反正我是失敗了,而且即使把上面老哥的程式碼跑一遍也還是失敗了,失敗的標誌就是程式閃退:停止執行,但是理論上我覺得是可行的,只是暫時還是不會正確使用ListViewAlertDIalog……

不過這個方法確實太麻煩了,還要定義容器,設定``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();

        } });
}

總結:大道至簡!