OnClickListener
类Java上实现时, MainActivity
工作正常。但是在同一类主干扰上使用它是一种混乱的做法。
所以我添加了一个单独的Java类ButtonListener.java
并编写了以下代码
public class ButtonListener extends MainActivity implements View.OnClickListener {
@Override
public void onClick(View v) {
switch(v.getId()) {
case R.id.button2:
CL.setBackgroundColor(Color.parseColor("#00ff00"));
break;
case R.id.button:
CL.setBackgroundColor(Color.BLUE);
break; }}}
以下是MainActivity.java
public class MainActivity extends AppCompatActivity {
public ConstraintLayout CL;
public Button blue,green;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
blue= (Button)findViewById(R.id.button);
green=findViewById(R.id.button2);
CL= findViewById(R.id.CL) ;
ButtonListener B= new ButtonListener();
blue.setOnClickListener(B);
green.setOnClickListener(B);
}}
我正在尝试使用此代码,但是当我打开应用程序并单击按钮时,它会崩溃。
答案 0 :(得分:1)
您收到NullPointerException
,因为您的cl
未初始化。
extends MainActivity
可让您访问cl
变量,但它从未被写入,并且与MainActivity.cl
完全不同。
使用自定义侦听器可以实现您的目标(强烈注意:您不需要扩展MainActivity来实现侦听器)
public class ButtonListener implements View.OnClickListener {
private ConstraintLayout CL;
public ButtonListener(ConstraintLayout cl) {
this.CL = cl;
}
@Override
public void onClick(View v) {
// bla bla
}
}
在MainActivity
中,替换:
ButtonListener B= new ButtonListener();
blue.setOnClickListener(B);
green.setOnClickListener(B);
使用:
ButtonListener B= new ButtonListener(CL); // pass contraints layout here
blue.setOnClickListener(B);
green.setOnClickListener(B);
答案 1 :(得分:0)
您在CL.setBackgroundColor(Color.parseColor("#00ff00"));
中呼叫ButtonListener
,当然它为空,因为它位于MainActivity
。您应该将ConstraintLayout CL
传递给ButtonListener
进行修复。我相信logcat说的很清楚。
然而,恕我直言,我不同意使用主类来实现其组件的任何行为是不好的。对我来说,它可以帮助您节省大量的新对象分配,传递参数,节省类数,因为当应用程序变大时,应用程序中可能会有很多点击监听器。
答案 2 :(得分:0)
public class ButtonListener implements View.OnClickListener {
private ConstraintLayout cl;
public ButtonListener(ConstraintLayout cl) {
this.CL = cl;
}
@Override
public void onClick(View v) {
switch(v.getId()) {
case R.id.button2:
CL.setBackgroundColor(Color.parseColor("#00ff00"));
break;
case R.id.button:
CL.setBackgroundColor(Color.BLUE);
break;
}
}}
问题是由于错误,CL是用RED编写的 主要活动代码
public class MainActivity extends AppCompatActivity {
public ConstraintLayout CL;
public Button blue,green;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
blue= (Button)findViewById(R.id.button);
green=findViewById(R.id.button2);
CL= findViewById(R.id.CL) ;
ButtonListener B= new ButtonListener(CL);
blue.setOnClickListener(B);
green.setOnClickListener(B);
}
}