【已解决】 对按钮设置单击事件,可以把View 传到内部方法设置吗?
老师, 模拟银行服务的教学。
最后为用户,员工,行长 绑定服务。
因为代码重复很多,我进行了代码重构。
现在有这么一个问题
我想把View 传到里面, 然后在里面设置单机事件的监听,我打Log 里面也执行了, 但我单击,还是没有反应。
是不可以还是我哪里有问题
1 把R.layout.activity_normal.里面的三个按钮 设置单击事件
但为了不让代码冗余 把R.layout.activity_normal inflate 成View对象
private static final String TAG = "NormalActivity";
private boolean bindService;
private ServiceConnection serviceConnection;
private NormalService normalService = new NormalService();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_normal);
View view = LayoutInflater.from(NormalActivity.this).inflate(R.layout.activity_normal,null);
normalService.init(NormalActivity.this,view);
Log.d(TAG,"初始化了");
bindService = normalService.bindBankService(Constant.NORMALUSER_ACTION);
serviceConnection =normalService.serviceConnection;
Button button =findViewById(R.id.saveMoney);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
normalService.saveMoneyClick();
}
});
}
2.这是NormalService类 上面的类 实例了它。
然后为什么下面设置了单击事件,但我执行程序后,服务是绑定了, 但按钮单击事件没有作用
public class NormalService implements View.OnClickListener{
protected boolean bindService;
private Context context;
public void init (Context context,View view){
this.context = context;
// 在这里同个id 绑定Button 然后设置监听。
Button saveMoney = view.findViewById(R.id.saveMoney);
saveMoney.setOnClickListener(this);
Log.d("NormalService","单击时间设置了 。。。");
Button getMoney = view.findViewById(R.id.getMoney);
getMoney.setOnClickListener(this);
Button loanMoney = view.findViewById(R.id.loanMoney);
loanMoney.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.saveMoney:
saveMoneyClick();
Toast.makeText(v.getContext(),"你存钱了",Toast.LENGTH_SHORT).show();
break;
case R.id.getMoney:
getMoneyClick();
Toast.makeText(v.getContext(),"你存钱了",Toast.LENGTH_SHORT).show();
break;
}
}
public ServiceConnection serviceConnection =new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
userAction = (INormalUserAction) service;
Log.d("NormalService","onServiceConnected...");
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
protected INormalUserAction userAction;
public boolean bindBankService(String action) {
Intent intent = new Intent();
intent.setAction(action);
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setPackage(context.getPackageName());
Log.d("NormalService","onBinder");
bindService = context.bindService(intent, serviceConnection, context.BIND_AUTO_CREATE);
Log.d("NormalService","bindService=="+bindService);
return bindService;
}
public void saveMoneyClick(){
userAction.saveMoney(10000);
}
public void getMoneyClick() {
userAction.getMoney();
}
}
View view = LayoutInflater.from(NormalActivity.this).inflate(R.layout.activity_normal,null);
normalService.init(NormalActivity.this,view);
你这代码,就是自己载了一个view么?
跟你设置给activity的是同一个布局,但不是同一个对象呀。
真是的。
理解了吗?
你显示的View和你findView不是同一个对象。
所以,你view.find到的不为空,也可以设置。但是你看到的并不是这个。看到的是通过setContontVeiw设置的那个。
setContentView重载了多个方法。
你通过setContentView,设置你打气筒载的view即可解决这个问题。
嗯,看完了。你这里的还是没有反应。指的是什么呢?
你的Toast有弹出来吗?
如果弹出来了,说明是已经点击到了呀。
另外则你的log不够多。onClick的回调里应该也整一个呀。
先定位到,是否有收到点击事件
如果收到了,再去确定为什么调用saveMoney无效。
没看懂你啥意思,你把代码补全吧。
代码还是别懒着截图了,上代码嘛。