Android监听事件学习笔记

很抱歉本文的图片没了,如果希望获取代码的和pdf(有图片)学习的可以下载附上的pdf链接:

1.在Android中,View只是提供一个视觉的交互界面,如果要让View响应用户的交互行为,就需要为View添加事件处理,如前面案例或实验中使用较多的View.OnClickListener事件侦听器,一般来说事件侦听器都是包含回调方法的抽象接口,例如OnClickListener对应的回调方法为OnClick()。实际上,除了OnClickListener事件外,Android中的事件侦听器还有(部分罗列):

侦听器 回调方法 描述

OnLongClickListener() OnLongClick() 对长点击事件进行监听

OnFocusChangeListener() OnFocusChange() 对聚焦事件进行监听

OnKeyListener() OnKey() 对按键输入进监听

OnTouchListener() OnTouch() 对某个控件的触摸检测

OnMenuItemClickListener() OnMenuItemClick() 选项菜单点击检测

OnCreateContextMenuListener() OnCreateContextMenu() 是用来处理上下文菜单显示事件的监听接口

请查阅相关资料或书籍,比较系统地学习一下Android中的事件处理,找出以上这些侦听器对应的使用场景,并补充其他相关的事件处理,如果可能的话请编程对其中的部分事件进行实际的验证。

我通过自己编写的一个案例来对上面六个Android事件监听器进行说明:


  1. OnLongClickListener()
    这是一个用于长点击事件监听的监听器,平时我们只是通过点击然后获得相应,但是如果想要获得长时间点击时候的响应就需要使用这个监听器,具体使用可以用在长点击弹出菜单:
  • 代码:
//给这个按钮设置长按监听
        longclickbutton = (Button) findViewById(R.id.button);
        longclickbutton.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                //输出消息
                Toast.makeText(MainActivity.this, "我是长按button", Toast.LENGTH_SHORT).show();
                return true;
            }
        });
  • 当长时间点击时就可以获得相应,这里输出一个弹出框。
  1. OnFocusChangeListener()
    这是用于焦点监听的监听器,比如输入框获得点击就会被监听到,这样当用户点击输入框时可以进行相对于的响应,比如显示输入不符合标准,就可以在输入时候给用户提示:
  • 代码:
//聚焦
foucus1 = (EditText) findViewById(R.id.editText);
foucus1.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if(hasFocus==true){
            foucus1.setHint("现在聚焦于此");
        }else{
            foucus1.setHint("现在聚焦于他处");
        }
    }
});
foucus2 = (EditText) findViewById(R.id.editText2);
foucus2.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if(hasFocus==true){
            foucus2.setHint("现在聚焦于此");
        }else{
            foucus2.setHint("现在聚焦于他处");
        }
    }
});
  • 这里用来两个输入框,当其中一个获取焦点显示“现在聚焦于此”,另外一个就无法获取焦点输出:“现在聚焦于他处”:
  1. OnKeyListener()
    这是一个用于获得键盘监听事件的监听器,当用户键盘输入时候就会立刻获得相应,这里用一个计算BMI的例子来举例,我对体重进行监听,当体重输入时就会显示出当前计算的BMI的值:
  • 代码:
//按键监听
        key1 = (EditText) findViewById(R.id.editText4);
        key2 = (EditText) findViewById(R.id.editText5);
        textview = (TextView) findViewById(R.id.textView2);
        key2.setOnKeyListener(new EditText.OnKeyListener(){
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                double x = Double.valueOf(key1.getText().toString());
                double y = Double.valueOf(key2.getText().toString());
                double z;
                try{
                    z= y/x;
                }catch (ArithmeticException exc){
                    Log.d(MainActivity.ACTIVITY_TAG,"计算错误");
                }
                textview.setText("BMI:"+y/x);
                return false;
            }
        });
  • 显示效果:
  1. OnTouchListener()
    触摸检测用于检测一些按下,松开,拖动等事件,使用也比较广泛,这里用一个按下松开事件进行说明:
  • 代码:
//触摸监听
        TouchButton = (Button) findViewById(R.id.button4);
        TouchButton.setOnTouchListener(new View.OnTouchListener(){
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        TouchButton.setText("按下");
                        break;
                    case MotionEvent.ACTION_UP:
                        TouchButton.setText("松开");
                        break;
                }
                return true;
            }
        });
  • 显示结果,当按下按钮显示按下,当松开按钮显示松开:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dWP1fMiQ-1585498335655)(D:\桌面\image-20200329234132502.png)]
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b4bWg4OS-1585498335659)(D:\桌面\image-20200329234132502.png)]
  1. OnMenuItemClickListener()
    选项菜单监听器,也就是在右上角的菜单,可以对选项进行监听:
  • 代码:
//选项菜单点击监听
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        getMenuInflater().inflate(R.menu.main_menu,menu);
        menu.findItem(R.id.menu_login).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                Toast.makeText(MainActivity.this, "登录按钮按下", Toast.LENGTH_SHORT).show();
                return true;
            }
        });
        menu.findItem(R.id.menu_setting).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                Toast.makeText(MainActivity.this, "设置按钮按下", Toast.LENGTH_SHORT).show();
                return true;
            }
        });
        menu.findItem(R.id.menu_exit).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                Toast.makeText(MainActivity.this, "退出按钮按下", Toast.LENGTH_SHORT).show();
                return true;
            }
        });
        return true;
    }

显示效果:

点击登录:

  1. OnCreateContextMenuListener()
    是用来处理上下文菜单显示事件的监听接口
  • 代码:
//长按显示上下文菜单按钮
        ContextMenuButton = (Button) findViewById(R.id.button2);
        ContextMenuButton.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                registerForContextMenu(v);
                openContextMenu(v);
                return true;
            }
        });
@Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        getMenuInflater().inflate(R.menu.main_menu,menu);
        menu.findItem(R.id.menu_login).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                Toast.makeText(MainActivity.this, "登录按钮按下", Toast.LENGTH_SHORT).show();
                return true;
            }
        });
        menu.findItem(R.id.menu_setting).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                Toast.makeText(MainActivity.this, "设置按钮按下", Toast.LENGTH_SHORT).show();
                return true;
            }
        });
        menu.findItem(R.id.menu_exit).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                Toast.makeText(MainActivity.this, "退出按钮按下", Toast.LENGTH_SHORT).show();
                return true;
            }
        });

    }
  • 显示结果

除了这些监听器之外还有很多其他的监听器,安坐这些监听器,有了这些监听器才可以让安卓更加方便使用。

<img src="D:\桌面\image-20200329234753038.png" alt="image-20200329234753038" style="zoom:50%;"/>


除了这些监听器之外还有很多其他的监听器,安坐这些监听器,有了这些监听器才可以让安卓更加方便使用。