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();

        } });
}

總結:大道至簡!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章