.setOnClickListener对空对象的引用(无法调用ID?)

时间:2018-09-20 06:17:06

标签: java android oop nullpointerexception

在这个应用程序中,我正在使用LinearLayout,TextView和两个Button动态创建一个计数器对象,我希望在类内部使用onClickListener,因为这似乎是最好的解决方案。

我唯一能想到的就是我以某种方式弄错了ID的创建。动态创建事物的最佳实践是什么?

该应用的屏幕截图和所有代码均已包含。

public class Counter implements View.OnClickListener {

    private final int subButtonId = View.generateViewId();

...

    private void createSubButton() {

        subButton = new Button(context);
        subButton.setLayoutParams(new LinearLayout.LayoutParams(buttonWidth, LinearLayout.LayoutParams.MATCH_PARENT, 0.5f));
        subButton.setText("-");
        subButton.setTextSize(buttonTextSize);
        subButton.setId(subButtonId);
        subButton.setGravity(Gravity.CENTER | Gravity.CENTER_HORIZONTAL);
        container.addView(subButton);

        sub = mainContainer.findViewById(subButtonId);
        sub.setOnClickListener(new MyOnClickListener() {
            @Override
            public void onClick(View v) {
                subCount();
                disp.setText(count.toString());
            }
        });
    }

}

class MyOnClickListener implements View.OnClickListener {


    public MyOnClickListener() {

    }

    @Override
    public void onClick(View v) {

    }
}

反类:https://pastebin.com/YTHUbGFf

主类:https://pastebin.com/p3p2PPEU

Logcat:https://pastebin.com/0fYSKJyj

应用图片:https://imgur.com/a/1Dfx4fJ

2 个答案:

答案 0 :(得分:0)

  1. 您无需再次查找视图。您可以致电subButton.setOnClickListener(...);
  2. 我没有看到containermainContainer之间的任何关系。您已将视图添加到container,但正在从mainContainer观看

答案 1 :(得分:0)

您可以直接在subButton上设置onOnClickListener。我修改了您的createSubButton()方法:

private void createSubButton() {

    subButton = new Button(context);
    subButton.setLayoutParams(new LinearLayout.LayoutParams(buttonWidth, LinearLayout.LayoutParams.MATCH_PARENT, 0.5f));
    subButton.setText("-");
    subButton.setTextSize(buttonTextSize);
    subButton.setId(subButtonId);
    subButton.setGravity(Gravity.CENTER | Gravity.CENTER_HORIZONTAL);
    container.addView(subButton);

    subButton.setOnClickListener(new MyOnClickListener() {
        @Override
        public void onClick(View v) {
            //do something
        }
    });
}

}