用户在应用界面上执行各种操作时,应用程序需要为用户的动作提供响应,这种响应的过程就是事件处理
一.基于监听的事件处理机制(优先于基于回调的事件处理机制)
1三要素(Event Source(事件源),Event(事件),Event Listener(事件监听器))
实现方式
-
内部类实现
public class EventActivity extends AppCompatActivity{
private Button mBtnEvent;@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_event); mBtnEvent = findViewById(R.id.btn_event); //TODO:通过内部类实现 mBtnEvent.setOnClickListener(new OnClick()); //内部类 class OnClick implements View.OnClickListener{ @Override public void onClick(View v) { switch (v.getId()){ case R.id.btn_event: ToastUtil.showMsg(EventActivity.this,"---click---"); break; } } } }
}
-
匿名内部类
public class EventActivity extends AppCompatActivity{
private Button mBtnEvent;@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_event); //TODO:通过匿名内部类实现 mBtnEvent.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ToastUtil.showMsg(EventActivity.this,"---click---"); } }); }
-
通过事件源所在的类实现
public class EventActivity extends AppCompatActivity implements View.OnClickListener { private Button mBtnEvent; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_event); mBtnEvent = findViewById(R.layout.btn_event); mBtnEvent.setOnClickListener(EventActivity.this);//通过事件源所在的类实现 } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_event: ToastUtil.showMsg(EventActivity.this, "---click---"); break; } } }
-
通过外部类(用的少)
MyClickListener.java public class MyClickListener implements View.OnClickListener{ private Activity mActivity; public MyClickListener(Activity activity){ this.mActivity = activity; } @Override public void onClick(View v) { ToastUtil.showMsg(mActivity,"---click---"); } }
EventActivity.java
public class EventActivity extends AppCompatActivity {
private Button mBtnEvent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_text_view);
mBtnEvent.findViewById(R.layout.btn_event);
mBtnEvent.setOnClickListener(new MyClickListener(EventActivity.this));
}
}
-
xml文件中绑定
public class TextViewActivity extends AppCompatActivity { private Button mBtnEvent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_text_view); } public void btnclick(View v) { switch (v.getId()) { case R.id.btn_event: ToastUtil.showMsg(EventActivity.this, "---click---"); break; } } }
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/btn_event" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="click" android:textAllCaps="false" android:onClick="btnclick"/> </LinearLayout>
给同一事件源添加多个同种类型监听器,系统只会执行最后一个设置的监听器,其它的都不会执行,且xml中onclick属性设置的事件最先注册,若java文件还通过其它方式监听事件,则onclick绑定的事件不会执行。