Android常用监听事件汇总(长期更新)

“长期更新,随时记录

欢迎补充,一起进步”

一、各控件的事件监听器和监听方法

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

再补充一个,再用户点击退出按钮时,想弹出一些弹窗,此时需要着重处理好,不要出现错误:

activity关闭和dialog.dismiss冲突的解决(Activity has leaked window com.android.internal.policy.impl.PhoneWindow)

@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的删除方法进行数据的删除。

随时添加 欢迎补充

  • 19
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值