这篇文章主要想写一下Android实现监听点击事件的几种方法,Activity和Fragment实现起来有些方法上会有些不一样,这里也略作介绍。编程
最近一直在忙一个项目,深感掌握监听事件的重要性,同时也要综合运用实现监听的几种方法,在编写代码的时候正确选择,既能减小代码量,代码的可读性也会更高。设计模式
一、全部的控件均可以注册监听来实现点击后执行某项操做,这并非只有Button这类的组件特有的功能。ide
二、 通常来讲每一个控件使用上面的第一种方法--使用匿名内部类的形式都是相似下面这种:this
Button mButton; mButton=(Button)findViewById(R.id.xx); mButton.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v){ //这里执行具体点击后的操做
} });
但并非每个组件的实现方式都是上面这种,这里我举两个例子给你们参考:spa
(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为咱们节省了不少工夫,也隐去了不少细节。code
举这两个例子也是但愿你们能正确使用匿名内部类为控件注册监听。blog
三、在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的编程很实用,仍是须要好好掌握。
像上面这样特殊的你们能够多积累,有点印象知道怎么用就行。
好了,下面详细看看上面的三种方法:
这里和上面的代码有些重复,你们参考一下就好。
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()必定要记得写,我本身也常常犯这样的错误,调试半天才发现是这个没写。
这后面两种都比较容易理解,这里我直接给出代码:
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; } } }
代码以下:
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 设计模式也并不适用。
MVVM设计模式,实质上就是 MVC的改进版,MVVM 就是将其中的View 的状态和行为抽象化,让咱们将视图 UI 和业务逻辑分开,这也使得咱们能直接在 XML 文件中直接操做控件点击事件,固然代码的编写就不是上面那样的,你们有兴趣的能够再自行上网查阅资料。
接触Android很少,是个菜鸟,上面有错误的地方还请你们指正,但愿能和你们多交流。