Android View的onClick事件監聽


目錄

點擊事件

findViewById()方法查找對應的view的id

監聽事件實現的幾種寫法


點擊事件


Android中Touch事件相關內容都被封裝到 MotionEvent 中,MotionEvent 中的時間類型有按下、擡起、滑動和結束事件。這些事件都是人機交互的一個過程,按下動作指的是人手指按在手機屏幕上這個動作,擡起動作指的是人手指按下手機後擡起來這個動作,移動動作指的是人手指按下屏幕後移動一段距離的這個動作。

那麼當人手指按下後擡起,就完成了點擊(onClick)這個動作。

MotionEvent.ACTION_DOWN:按下(按下動作)

MotionEvent.ACTION_UP:擡起(擡起動作)

MotionEvent.ACTION_MOVE:滑動(滑動動作)

MotionEvent.ACTION_CANCEL:結束事件(非人爲)

在onClick事件中我們去監聽要去做什麼樣的動作,通過控件(View)自身的.setOnClickListener(OnClickListener)方法添加onClick事件,除了我們常用的按鈕(Button)之外,其他的控件也含有點擊事件,通過點擊事件的監聽可以實現點擊按鈕之後要發生的動作(業務邏輯)。

 

 

findViewById()方法查找對應的view的id


在資源目錄 res 文件夾下的所有資源(文件以及信息)系統都會自動在 gen 目錄中的 R.java 文件中生成一個對應且唯一的id。我們可以通過這個唯一的id去查找當前對應的內容。gen目錄下的所有文件是不需要我們手動添加和修改的,它是會自動在編譯中生成,系統會自動對其進行操作。 

R.id.XXX 這句話中的 R 指的就是 gen 目錄中的 R.java 文件,R文件中對應的id指的是我們需要去找的那個控件的id,控件id在我們編輯 xml 佈局文件的時候給控件添加 android:id 屬性添加,R文件中會自動生成與之對應的 id 值。所以我們訪問的是 R.id 中控件 id 對應的系統自動生成的id值。這樣子我們就可以訪問到當前這個控件。

 

 

 //通過findViewById的方法查找對應View的id
        btnOne = (Button) findViewById(R.id.btn_one);

 

 

監聽事件實現的幾種寫法


1.匿名內部類實現事件監聽

2.獨立類(外部類)實現事件監聽

3.實現OnClickListener接口實現事件監聽

4.重寫onClick(View view)方法實現事件監聽(標籤處理)

 

匿名內部類方式

要去監聽一個控件(View)的事件,我們需要去初始化控件。

就是說如果我們想要去爲一個Button去添加一個點擊事件的監聽,我們要去找到這個控件纔可以對它進行操作和處理。

初始化控件首先是要聲明出來一個實體對象,然後對這個對象賦值,找到 xml 佈局文件中對應的控件,在java源代碼文件中通過 findViewById() 方法訪問控件的 id 返回一個控件對象。

然後通過控件對象自身的 .setOnClickListener(OnClickListener) 方法添加點擊事件。這樣就是通過匿名內部類的方式的點擊事件監聽。

//聲明初始化控件View(Button)
    private Button btnOne;

 //通過findViewById的方法查找對應View的id,查找id和實現監聽都寫在onCreate()生命週期中
        btnOne = (Button) findViewById(R.id.btn_one);

//匿名內部類實現事件監聽
        btnOne.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(MainActivity.this, "通過匿名內部類實現點擊事件監聽", Toast.LENGTH_SHORT).show();
                tvShow.setText("通過匿名內部類實現點擊事件監聽");
            }
        });

實現結果:

 

獨立類方式

這種實現方式比較少見,看起來跟通過匿名內部類實現事件監聽相似,但有些許不同。

通過獨立類實現事件監聽首先自定義 mOnClickListener 類,該類實現 OnClickListener 接口。然後自定義的監聽類會自動生成 onClick 方法,點擊控件要進行的操作可以在這裏實現。

因爲自定義監聽類中的onClick方法是public的,所以我們可以覆寫也可以不覆寫。當覆寫OnClick方法的時候會自動生成 super.onClick(view);這個語句是調用父類的onClick方法也就是我們自定義類中onClick方法中實現的內容。

如果我們在覆寫的 onClick 方法中寫入了實現邏輯,在自定義點擊類( mOnClickListener )中也定義了實現邏輯,那麼我們在實現覆寫的 onClick 方法中的邏輯同時,因爲 super.onClick(view); 的原因也會去實現父類中onClick()方法中的實現邏輯。

外部類實現監聽 View 點擊事件的場景是當很多個控件在實現監聽的時候除了實現自己本身需要的邏輯之外,還要實現同樣的一個動作,那麼就可以通過外部類的方式去實現點擊事件的監聽,將都需要實現的公共邏輯在外部類中實現,然後在覆寫的方法中去實現自己本身需要去實現的業務邏輯。

外部類的寫法就是提取一些邏輯內容相同的部分,減少代碼的冗餘。用不用外部類去實現點擊事件的監聽主要是看我們有沒有遇到需要這樣去實現的場景。

class mOnClickListener implements View.OnClickListener {

    @Override
    public void onClick(View view) {
        Log.i("MS","通過獨立類實現點擊事件監聽");
    }
}

//MainActivity.java
//聲明初始化控件View(Button)
    private Button btnTwo;

//通過findViewById的方法查找對應View的id
        btnOne = (Button) findViewById(R.id.btn_two);

//使用獨立類實現點擊事件監聽
        btnTwo.setOnClickListener(new mOnClickListener(){
            @Override
            public void onClick(View view) {
                super.onClick(view);
                Toast.makeText(MainActivity.this, "通過獨立類實現點擊事件監聽", Toast.LENGTH_SHORT).show();
                tvShow.setText("通過獨立類實現點擊事件監聽");
            }
        });

實現結果:

 

實現OnClickListener接口方式

通過接口方式去實現監聽事件首先我們要讓需要處理的類去實現 OnClickListener 接口,實現這個接口後會讓我們去生成 onClick() 方法進行覆寫。這個時候業務邏輯實現的地方我們已經找到了,接下來我們來進行對控件view進行綁定的動作。

View的綁定首先是進行控件的聲明,然後通過findViewById查找對應view的id,最後實現一個接口的方式實現監聽事件(view.setOnClickListener(this))。因爲在我們當前類中實現的是一個接口, this 也就是訪問當前類的接口的一個對象,這樣寫完之後就是把當前onClick事件綁定到控件View上面去了。當我們點擊View的時候它就會觸發當前onClick實現方法。

 

//當前類實現View.OnClickListener
public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    //聲明初始化控件View(Button)
    private Button btnThree;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //通過findViewById的方法查找對應View的id
        btnThree= (Button) findViewById(R.id.btn_three);
        //this是訪問當前類的接口的一個對象,就是把當前OnClick事件綁定到控件view上面去
        btnThree.setOnClickListener(this);
    }

    //通過接口方式實現事件監聽
    @Override
    public void onClick(View view) {
        Toast.makeText(MainActivity.this, "通過接口方式實現事件監聽", Toast.LENGTH_SHORT).show();
        tvShow.setText("通過接口方式實現事件監聽");
    }
}

實現結果:

 

重寫onClick(View view)方式(標籤處理)

在XML佈局文件的 onClick 標籤上綁定需要的方法,屬性值爲方法名。之後在 java 源文件中編輯該方法,將監聽內容寫入方法即可。

實現結果:


 

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