android怎么把监听类不写成内部类的形式,用外部类。
之后调用的时候直接setOnClickListener(new这个外部类),这样可能访问不了里面的私有成员变量了,这点你们怎么看?...
之后调用的时候直接setOnClickListener(new 这个外部类),这样可能访问不了里面的私有成员变量了,这点你们怎么看?
展开
4个回答
展开全部
setOnClickListener(new MyClickListener(参数...));把私有成员变量当作参数传递进去。
OnClickListener本身是一个接口,要实现Onclick方法,如果你多个view有同样的onClick操作,当然是可以把他写成外部类。 但是 一般情况下我们各自的view有各自不同的操作和跳转,而且在MVC模式中Listener本身作为controller也不应该做model的操作,所以正常编写程序这里并不会做什么跳转之外的操作,如果在onClick方法里如果有了共同的计算,是不是该考虑自己程序的流程是不是需要改进。如果只是在方法之前需要一定的流程判定,可以写一个静态的方法出来,在需要判断的onClick事件之前去调用。
OnClickListener本身是一个接口,要实现Onclick方法,如果你多个view有同样的onClick操作,当然是可以把他写成外部类。 但是 一般情况下我们各自的view有各自不同的操作和跳转,而且在MVC模式中Listener本身作为controller也不应该做model的操作,所以正常编写程序这里并不会做什么跳转之外的操作,如果在onClick方法里如果有了共同的计算,是不是该考虑自己程序的流程是不是需要改进。如果只是在方法之前需要一定的流程判定,可以写一个静态的方法出来,在需要判断的onClick事件之前去调用。
追问
我反编译许多项目的源码,看到Adapter,Thread,Handler,AsyncTask,Listener这些都没写在内部类中,这样可以让activity类的代码看起来不那么臃肿,但是它们这样做是怎么做到使用原类的私有成员变量的呢?
追答
反编译后你看到的是MainActivity$MyClickListener.java 这种格式的吧, 这个就是内部类啊。说明这个MyClickListener是MainActivity的内部类,这个是通过.class文件反编译回来的。java在编译为class的时候回把内部类拿出来生成单个的.class文件,所以你反编译后看到的就是分开的。
很明确的告诉你:写成外部类是不可能访问私有成员变量的。
展开全部
package com.joyvision.ld.activity;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class test extends Activity implements OnClickListener {
public Button but;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
this.but = (Button)findViewById(R.id.bt_download);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch(v.getId()){
case R.id.bt_download :
Toast.makeText(test.this, "bt_download", Toast.LENGTH_LONG).show();
break;
default:
Toast.makeText(test.this, "没有指定该按钮", Toast.LENGTH_LONG).show();
break;
}
}
}
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class test extends Activity implements OnClickListener {
public Button but;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
this.but = (Button)findViewById(R.id.bt_download);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch(v.getId()){
case R.id.bt_download :
Toast.makeText(test.this, "bt_download", Toast.LENGTH_LONG).show();
break;
default:
Toast.makeText(test.this, "没有指定该按钮", Toast.LENGTH_LONG).show();
break;
}
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
大人!在我看来~
自定义一个类,实现OnClickListener接口。
然后将这个类的对象填入setOnclickListener()即可~
自定义一个类,实现OnClickListener接口。
然后将这个类的对象填入setOnclickListener()即可~
追问
我反编译许多项目的源码,看到Adapter,Thread,Handler,AsyncTask,Listener这些都没写在内部类中,这样可以让activity类的代码看起来不那么臃肿,但是它们这样做是怎么做到使用原类的私有成员变量的呢?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你也可以直接把activity实现OnClickListener接口,这样在设监听器时setOnClickListener(this)就行了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询