“长期更新,随时记录
欢迎补充,一起进步”
一、各控件的事件监听器和监听方法
1.Button(按钮)的监听事件:OnClickListener 接口 onClick(View v)接口方法;
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Perform action on click
}
});
2.SeekBar(进度条)的监听事件:OnSeekBarChangedListener接口,
①onProgressChanged(SeekBar seekBar, int progress, boolean fromUser);
②onStartTrackingTouch(SeekBar seekBar);//滑动开始
③onStopTrackingTouch(SeekBar seekBar);//滑动结束
3. EditText(编辑器)的监听事件:OnKeyListener接口
onKey(View v, int keyCode, KeyEvent event)//接口方法 监听键盘事件
// 对EditText进行监听,监听用户在操作EditText时点击输入键
edit.setOnKeyListener(new View.OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_ENTER) {
if (!"".equals(edit.getText().toString())
&& Integer.parseInt(edit.getText().toString()) <= 15) {
autoScroll(Integer.parseInt(edit.getText().toString())); // 执行操作
} else
Toast.makeText(getActivity(), "Insert correct value (only \"1\" to \"15\").",
Toast.LENGTH_LONG).show();
}
return false;
}
});
4. RadioGroup(单选按钮)的监听事件:OnCheckedChangeListener接口
onCheckedChanged(RadioGroup group, int checkedId)//接口方法;
5. Spinner(下拉列表)的监听事件:OnItemSelectedListener接口
①onItemSelected(AdapterView<?> parent, View view, int position, long id);
②onNothingSelected(AdapterView<?> parent)
6. Menu(菜单)的监听事件:Activity内部方法 不同菜单调用不同选择方法
①public boolean onMenuItemSelected (int featureId, MenuItem item);
②public boolean onOptionsItemSelected (MenuItem item);
③public boolean onContextItemSelected (MenuItem item);
7. Dialog(对话框)的监听事件:实现了多个总类型接口,每个总类型接口中有若干个接口,根据不同种类Dialog,会实现不同的接口方法。implements DialogInterface KeyEvent.Callback View.OnCreateContextMenuListener Window.Callback
如按钮类型的Dialog会实现总接口下的子接口DialogInterface.OnClickListener;
8. DatePicker(日期)日期改变的监听事件: OnDateChangedListener接口
onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth);
9. TimePicker(时间)一天中事件改变的监听事件:OnTimeChangedListener接口
onTimeChanged(TimePicker view, int hourOfDay, int minute);
10. SlidingDrawer(滑动式抽屉)的监听事件:OnDrawerOpenListener接口
onDrawerOpened();Invoked when the drawer becomes fully open.
11. RatingBar(星级等级评价)的监听事件:OnRatingBarChangeListener
onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser);
12. Chronometer(计数器)的监听事件:OnChronometerTickListener接口
onChronometerTick(Chronometer chronometer); //提示计数器数字改变
二、View内部定义好的事件监听器和调用时机
1. setOnClickListener(View.OnClickListener l)
Register a callback to be invoked when this view is clicked.
2. setOnCreateContextMenuListener(View.OnCreateContextMenuListener l)
Register a callback to be invoked when the context menu for this view is being built.
3. setOnDragListener(View.OnDragListener l)
Register a drag event listener callback object for this View.
4. setOnFocusChangeListener(View.OnFocusChangeListener l)
Register a callback to be invoked when focus of this view changed.
5. setOnGenericMotionListener(View.OnGenericMotionListener l)
Register a callback to be invoked when a generic motion event is sent to this view.
6. setOnHoverListener(View.OnHoverListener l)
Register a callback to be invoked when a hover event is sent to this view.
7. setOnKeyListener(View.OnKeyListener l)
Register a callback to be invoked when a hardware key is pressed in this view.
8. setOnLongClickListener(View.OnLongClickListener l)
Register a callback to be invoked when this view is clicked and held.
9.setOnSystemUiVisibilityChangeListener(View.OnSystemUiVisibilityChangeListener l)
Set a listener to receive callbacks when the visibility of the system bar changes.
10. setOnTouchListener(View.OnTouchListener l)
Register a callback to be invoked when a touch event is sent to this view.
三、其他类型的监听事件和接口方法
1.动画变化监听事件
setAnimationListener(new Animation.AnimationListener(){});
①onAnimationStart(Animation animation) – 动画开始时调用
②onAnimationEnd(Animation animation) – 动画结束时调用
③onAnimationRepeat(Animation animation) – 动画重复时调用
监听动画的某一次执行结果(不必每次都覆写多个方法)
addListener(new AnimatorListenerAdapter(){}
onAnimationEnd(Animator animation) - 只在动画执行完成时调用
2.ViewPager的滑动监听事件
setOnPageChangeListener(OnPageChangeListener onPageChangeListener)
①onPageScrolled(int position, float positionOffset, int positionOffsetPixels) - 当页面在滑动的时候会调用此方法,在滑动被停止之前,此方法回一直得到调用;第一个参数:当前页面,第二个参数:当前页面偏移百分比(以0.6为界,标记是否滑动到下一个还是回到原位),第三个参数:当前页面偏移的像素位置;
②onPageSelected(int position) - 此方法是页面跳转完后得到调用;参数position为当前所在位置;
③onPageScrollStateChanged(int state) - 在状态改变的时候调用;参数state有三个值:0-do nothing,1-正在滑动,2-滑动结束;
3.GestureDetector的屏幕事件
使用继承,然后只实现需要的方法,而不必实现接口,去实现所有的接口方法
private class gestureListener extends
GestureDetector.SimpleOnGestureListener {
public boolean onDown(MotionEvent e) {
Log.i("MyGesture", "onDown");
if (lutFilterRecyclerView.getVisibility() == View.VISIBLE) {
lutFilterRecyclerView.setVisibility(View.GONE);
is_filter_on = false;
}
return false;
}
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
return true;
}
}
四、实例
①系统弹窗AlertDialog的点击事件DialogInterface.OnClickListener及五种内置样式:
private void showDeleteDialog() {
final AlertDialog.Builder builder = new AlertDialog.Builder(this, AlertDialog.THEME_DEVICE_DEFAULT_LIGHT);
builder.setTitle(R.string.notice)
.setMessage(R.string.delete_message)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
MobclickAgent.onEvent(HistoryActivity.this, "main_click_history_clean");
mHistoryDatabase.clearHistory();
mHistoryAdapter.clear();
mHistoryAdapter.notifyDataSetChanged();
}
}).setNegativeButton("No", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
return;
}
});
builder.create().show();
}
<AlertDialog 主题颜色> 注意导包时选择import android.app.AlertDialog;而不是import android.support.v7.app.AlertDialog;
1)传统主题:默认样式
AlertDialog.Builder builder = new AlertDialog.Builder(DialogActivity.this,AlertDialog.THEME_TRADITIONAL)
2)深黑色主题
AlertDialog.Builder builder = new AlertDialog.Builder(DialogActivity.this,AlertDialog.THEME_HOLO_DARK);
3)深蓝色主题
AlertDialog.Builder builder = new AlertDialog.Builder(DialogActivity.this,AlertDialog.THEME_HOLO_LIGHT);
4)浅黑色主题
AlertDialog.Builder builder = new AlertDialog.Builder(DialogActivity.this,AlertDialog.THEME_DEVICE_DEFAULT_DARK);
5) 浅蓝色主题
AlertDialog.Builder builder = new AlertDialog.Builder(DialogActivity.this,AlertDialog.THEME_DEVICE_DEFAULT_LIGHT);
使用自定义弹窗:
// 第一次进入应用 弹出权限弹窗
if(PreferenceManager.getDefaultSharedPreferences(this).getBoolean("show_permission_dialog", true)) {
showPermissionDialog();
PreferenceManager.getDefaultSharedPreferences(this).edit().putBoolean("show_permission_dialog", false).apply();
}
// 自定义权限弹窗
private void showPermissionDialog() {
View view = View.inflate(this, R.layout.dialog_permission, null);
TextView mPermission;
mPermission = (TextView) view.findViewById(R.id.request_permission);
final Dialog dialog = new Dialog(this);
dialog.setContentView(view);
dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
int divierId = getResources().getIdentifier("android:id/titleDivider", null, null);
View divider = dialog.findViewById(divierId);
if (divider != null) {
divider.setBackgroundColor(Color.TRANSPARENT);
}
mPermission.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
requestCameraAndStoragePermission();
dialog.dismiss();
}
});
try {
dialog.show();
} catch (Exception e) {
e.printStackTrace();
}
WindowManager.LayoutParams p = dialog.getWindow().getAttributes(); //获取对话框当前的参数值
p.width = Math.round(DensityUtil.dip2px(this, 320));
p.height = WindowManager.LayoutParams.WRAP_CONTENT;
p.gravity = Gravity.CENTER_VERTICAL;
/* 默认将弹窗居中,下面将弹窗向上移
float w = getResources().getDisplayMetrics().widthPixels * 1.0f;
float h = getResources().getDisplayMetrics().heightPixels * 1.0f;
mScreenRatio = h / w;
if (mScreenRatio > 1.9) {
p.y = -Math.round(DensityUtil.dip2px(this, 20));
} else {
p.y = -Math.round(DensityUtil.dip2px(this, 45));
}*/
dialog.setCancelable(false); // 点击屏幕空白处 弹窗不消失
dialog.setCanceledOnTouchOutside(false); // 点击返回按钮 弹窗不消失
dialog.getWindow().setAttributes(p);
}
再补充一个,再用户点击退出按钮时,想弹出一些弹窗,此时需要着重处理好,不要出现错误:
@Override
public void onBackPressed() {
/* super.onBackPressed(); 需要注释掉 否则会报错即弹窗依附的Activity消失 注释掉Activity不会主动消失*/
mFilterManager.setCurrentFilter(FilterType.NONE);
sendBroadcast(new Intent(EditImageSelectActivity.CLOSE_ANIMATION));
if (is_show){
showDeleteDialog();
}
}
②RecyclerView滚动监听RecyclerView.OnScrollListener,监听是否滚动到最后一项
recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
boolean isSlidingToLast = false;
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();
// 当停止滑动时
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
//获取最后一个完全显示的ItemPosition ,角标值
int lastVisibleItem = manager.findLastCompletelyVisibleItemPosition();
int totalItemCount = manager.getItemCount();
if (lastVisibleItem == (totalItemCount - 1) && isSlidingToLast) {
//do something
}
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (dy > 0) {
isSlidingToLast = true;
} else {
isSlidingToLast = false;
}
}
});
③RecyclerView添加滑动监控RecyclerView.OnScrollListener,比如列表滑动时涉及UI变化:
注:这里使用的是addOnScrollListener()方法,上面使用的是setOnScrollListener()方法。
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
btnClear.show(); //列表停止滑动时 右下角悬浮按钮设为可见
}
super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
if (dy > 0 || dy < 0 && btnClear.isShown()) {
btnClear.hide(); //列表滑动时 右下角悬浮按钮设为不可见
}
super.onScrolled(recyclerView, dx, dy);
}
});
④RecyclerView列表项做到左右滑动ItemTouchHelper.SimpleCallback,并且滑动时进行删除:
比如方片的效果:
监听事件代码如下:
final SongAdapter songAdapter = new SongAdapter(songList);
ItemTouchHelper helper = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(
ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
songAdapter.removeItem(viewHolder.getAdapterPosition());
}
});
recyclerView.setAdapter(songAdapter);
recyclerView.scrollToPosition(songAdapter.getItemCount() - 1); //进入列表页面时 滑动至最后一项
helper.attachToRecyclerView(recyclerView);
自定义删除列表项的方法removeItem():
public void removeItem(int position) {
mSongList.remove(position);
notifyItemRemoved(position); //删除列表数据是调用此方法
}
注:这里删除并不是真的删除,只是简单的视觉上的移除,下次进入还是会有数据;真正的删除需要处理其他逻辑,比如调用数据库SQLDataBase的删除方法进行数据的删除。
随时添加 欢迎补充