无法将OnClickListener实现为单独的Java类

时间:2018-05-19 15:04:20

标签: java android onclicklistener

当我在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);
}}

我正在尝试使用此代码,但是当我打开应用程序并单击按钮时,它会崩溃。

3 个答案:

答案 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);

    }



}