【问题标题】:.setOnClickListener on a null object reference (Can't call ID?) [duplicate]空对象引用上的.setOnClickListener(不能调用ID?)[重复]
【发布时间】:2018-09-20 06:17:06
【问题描述】:

在这个应用程序中,我动态地创建了一个带有 LinearLayout、TextView 和两个按钮的计数器对象,我希望在类中使用 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

【问题讨论】:

  • 在这里直接分享错误logcat ..
  • sub 可能为空,分享完整的错误日志
  • 您将视图添加到container,然后尝试在mainContainer 中查找。
  • 我建议您创建一个 XML 布局并动态扩展它,或者更好地尝试实现 recyclerview,因为您正在处理计数器数组。
  • 试试mainContainer.findViewById(R.id.subButtonId);

标签: java android oop nullpointerexception


【解决方案1】:
  1. 您无需再次查找视图。您可以拨打subButton.setOnClickListener(...);
  2. 我看不出containermainContainer 之间有任何关系。您将视图添加到您的 container,但从 mainContainer 查看

【讨论】:

    【解决方案2】:

    您可以直接在 subButton 上设置 OnClickListener。我修改了你的 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
            }
        });
    }
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-31
      • 2016-10-04
      • 2015-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多