您的位置:首页 > 移动开发 > Android开发

Android~外部类监听器~实现Activity的跳转

2015-10-11 20:06 435 查看
依旧是那个Java学习助手的开发,由于最近又在学习软件的设计模式,所以想将最近学习的简单工厂模式加入进去,个人感觉学习书上的内容不如自己实践。于是我就开始了。

然而问题也随之而来。

在设计的一个Activity中有一组功能比较相近的Button,所以不想对每个Button采用如下的方法:

</pre><pre name="code" class="java"><pre name="code" class="java">//btn_click是先前已经注册的Button对象
btn_click.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v){
//内容
}
});




</pre>这样的方式虽然简便,同时直观。但是如果一个Activity中有多个button时,那整个文件将变的冗长,尤其是Button之间之间的功能相差不大时。后又很多的重复代码。这样的程序肯定是不好的。<p></p><p>所以我考虑写一个继承了onClickListener接口的类,来实现OnClick事件。</p><p>调整前代码为:</p><p></p><pre name="code" class="java"><pre name="code" class="java">btn_click.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v){
Intent intent = new Intent();
intent.setClass(MainActivity.this,SecondActivity.class);
this.startActivity(intent);
}
});



调整时则出现问题:

则在重新设计类Button_listener时:

<pre name="code" class="java">public class Button_listener implements View.OnClickListener{
public void onClick(View v){
Intent intent = new Intent();
intent.setClass(MainActivity.this,SecondActivity.class);
this.startActivity(intent);
}
}




而这段代码则错误百出,首先是MainActivity.this肯定是实现不了的。因为不是在当前的Activity中。所以MainActivity是无法识别的。

再者,startActivity()这个方法继承onClickListener是无法使用的。

所以就要对方法进行改进,在网上查了很多如何获取当前运行的Activity的实例的解决方法,以便可以将MainActivity.this处替代。然而没有找到好的解决办法。

后来仔细看doc才知道原来传递的第一个量是个Context,这下问题就简单了。特此写这篇文章记录一下,防止自己忘记。

public class Button_listener implements View.OnClickListener{
private Context context;
public Button_listener(Context context){//写个构造函数,在使用时将当前Activity的this传递过来即可实现Intent的跳转。
this.context = context;
}
public void onClick(View v){
Intent intent = new Intent();
intent.setClass(<span style="color:#ff0000;">context</span>,SecondActivity.class);
<span style="color:#ff0000;">context</span>.startActivity(intent);
}}




而当一组Button相近时,不可能写多个onClick()事件,所以,用简单工厂的设计模式,重新设计一个Button_Factory类。

public class Button_Factory {

private Context context;

Button_Factory(Context context){
this.context = context;
}

//根据点击button的id决定如何进行跳转
public void event_choose(int id){
Intent intent = new Intent();
if(id == R.id.btn_load){
intent.setClass(context,Function_choose.class);
}
else if(id ==R.id.btn_chapter){
intent.setClass(context,Chapter_choose.class);
}
else if(id ==R.id.btn_chapter_one_two){
intent.setClass(context,Single_choose_question.class);
}
context.startActivity(intent);

}

}


在Button_Listener中这样写就行了:

public class Button_listener implements View.OnClickListener{
private Context context;
public Button_listener(Context context){//写个构造函数,在使用时将当前Activity的this传递过来即可实现Intent的跳转。
this.context = context;
}
public void onClick(View v){

<span style="white-space:pre">	</span>(new Button_Factory(context)).event_choose(v.getId());

}
}


则对每一个Button都设置改监听器的对象,将其需要的跳转写在Button_Factory中的event_choose()方法中即可解决问题。

这次遇到的问题提醒我,,遇到问题先看看api,看看doc不一定需要到网上求解,只要自己肯钻研,就能解决问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: