• Android实现监听控件点击事件


    Android实现监听控件点击事件

    引言

             这篇文章主要想写一下Android实现监听点击事件的几种方法,Activity和Fragment实现起来有些方法上会有些不同,这里也略做介绍。

             最近一直在忙一个项目,深感掌握监听事件的重要性,同时也要综合运用实现监听的几种方法,在编写代码的时候正确选择,既能减少代码量,代码的可读性也会更高。

     

    总结

         1、通过匿名内部类实现监听

          2、直接实现监听接口实现监听

          3、自定义内部类实现接口实现监听

    一些我想说的:

           1、所有的控件都可以注册监听来实现点击后执行某项操作,这并不是只有Button这类的组件特有的功能。

           2、 一般来说每个控件使用上面的第一种方法--使用匿名内部类的形式都是类似下面这种:

    Button mButton;
    
    mButton=(Button)findViewById(R.id.xx);
    
    mButton.setOnClickListener(new OnClickListener(){
         @Override
         public void onClick(View v){
              //这里执行具体点击后的操作
    
         }
    });

     但并不是每一个组件的实现方式都是上面这种,这里我举两个例子给大家参考:

           (1)、ListView利用匿名内部类实现监听

    ListView mListView=(ListView)findViewById(R.id.xx);
    
    mListView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
         @Override
         public void onItemClick(AdapterView<?> parent,View view,int position,long id){
              //这里执行具体操作
    
          }
    });
           

           (2)、RecyclerView利用匿名内部类实现监听

    //定义ViewHolder内部类
    private class xxxx extends RecyclerView.ViewHolder {
    
            public xxxx(LayoutInflater inflater,ViewGroup parent){
                super(inflater.inflate(R.layout.list_item,parent,false));
                itemView.setOnClickListener(new RecyclerView.OnClickListener(){
    
                    @Override
                    public void onClick(View v) {
                        Toast.makeText(getActivity(),"点击按钮", Toast.LENGTH_LONG).show();
                    }
                });
           }
    }

     在这点上面RecyclerView还是更高级一些,内部实现的这个itemView为我们节省了很多工夫,也隐去了很多细节。

    举这两个例子也是希望大家能正确使用匿名内部类为控件注册监听。

           3、在Fragment的写法略有区别,这点大家要注意,这里将上面那个Button的修改为在Fragment中

    Button mButton;
    
    mButton=(Button)View.findViewById(R.id.xx);
    
    mButton.setOnClickListener(new View.OnClickListener(){
         @Override
         public void onClick(View v){
              //这里执行具体点击后的操作
    
         }
    });

    只是在findViewById()方法前也要记得加View,还有一些是加getActivity()方法的,Fragment的编程很实用,还是需要好好掌握。

    像上面这样特殊的大家可以多积累,有点印象知道怎么用就行。

    好了,下面详细看看上面的三种方法:

        1、通过匿名内部类实现监听

          这里和上面的代码有些重复,大家参考一下就好。

    public class MainActivity extends AppCompatActivity {
    
        private Button login;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            login = (Button) findViewById(R.id.login);
    
            login.setOnClickListener(new View.OnClickListener(){
    
                @Override
                public void onClick(View v) {
                    
                     Toast.makeText(MainActivity.this,"点击登录",Toast.LENGTH_SHORT).show();
    
                 }
         });
    }
    }

    上面的代码Toast后面的show()一定要记得写,我自己也经常犯这样的错误,调试半天才发现是这个没写。

     

        2、直接实现接口实现监听

          这后面两种都比较容易理解,这里我直接给出代码:

    public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Button mButton=(Button)findViewById(R.id.create_database);
            mButton.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()){
                case R.id.create_database:
                    //执行具体操作
                    break;
                    
                default:
                    break;
            }
        }
    }

     

        3、自定义内部类实现接口实现监听

          代码如下:

    public class MainActivity extends AppCompatActivity {
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Button mButton=(Button)findViewById(R.id.create_database);
            mButton.setOnClickListener(new MyButtonListener());
        }
    
       class MyButtonListener implements View.OnClickListener{
    
           @Override
           public void onClick(View v) {
               switch (v.getId()){
                   case R.id.create_database:
                       //执行具体操作
                       break;
                       
                   default:
                       break;
               }
           }
       }
    }

    当然,这里也可以不用内部类来实现,新建一个类来继承View.OnClickListener接口也是可以的,不过我并不建议这种做法,这样写还不如直接在本类中继承接口。

     我的一些看法:

    这上面的三种方法实际上就是一种方法,只是通过不同方式来实现继承View.OnClickListener接口,看个人习惯,掌握了类的继承这三种方法都好理解。

    就我个人的建议,当需要注册监听事件的控件较少时,使用匿名内部类得到方法会直观便捷一些,当这类的控件较多时,利用第二或者第三种会好一些,毕竟不用每一个去重写 onClick() 方法。

     

     

    总结:

    这上面和大家分享了一下 Android 实现注册监听的几种方法,也分享了一下我自己的看法,实质还是接口的继承,好好理解类的继承相信这上面的完全不是问题。

    在实现上也要注意 Activity 和 Fragment 的区别,不行就在方法前加一个 View 或者getActivity() 之类的,多积累 Fragment 在界面编辑上还是很实用的。

    注:本文是Android基于MVC设计模式。

    这里大家可以考虑一个问题,在按钮控件很少的情况下我们可以在代码中通过注册监听的情况实现监听点击,但在实际中的Android项目都是十分庞大的,特别像手机游戏这类的,利用这类方法去实现显然时很吃力的,显然 MVC 设计模式也并不适用。

    MVVM设计模式,实质上就是 MVC的改进版,MVVM 就是将其中的View 的状态和行为抽象化,让我们将视图 UI 和业务逻辑分开,这也使得我们能直接在 XML 文件中直接操作控件点击事件,当然代码的编写就不是上面那样的,大家有兴趣的可以再自行上网查阅资料。

    接触Android不多,是个菜鸟,上面有错误的地方还请大家指正,希望能和大家多交流。

    本文系原创,转载还请注明出处。

     

     

  • 相关阅读:
    IO流 编码格式转换
    SFTP
    windows下redis 开机自启动
    NationalInstruments.UI.WindowsForms.NumericEdit
    VisualStudio SVN忽略
    VS2012 项目引用了项目/DLL文件,也写了Using,但是编译时提示:未能找到类型或命名空间名称
    JS原型链与继承
    HTML+CSS快速编写插件EMMET
    PHP中的替代语法(冒号、endif、endwhile、endfor)(转)
    在Android studio中如何把项目放到远程git或从远程git得到项目
  • 原文地址:https://www.cnblogs.com/hzauxx/p/11020626.html
Copyright © 2020-2023  润新知