应该设置的空按钮数组

时间:2017-12-05 10:29:55

标签: java android nullpointerexception

我不明白为什么在我的代码中我得到了:

  

null引用对象

当我尝试点击我的按钮时。

buttonMenuOption = findViewById(R.id.buttonOption);
Button[] buttonsOption = new Button[nbObjects];
buttonsOption[0] = findViewById(R.id.buttonOption0);
buttonsOption[1] = findViewById(R.id.buttonOption1);
buttonMenuOption.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        setContentView(R.layout.graph_option);
            for (int i = 0; i < nbObjects; i++) {
                final int j = i;
                    buttonsOption[i].setOnClickListener(new View.OnClickListener() {
                        public void onClick(View v) {
                            //Do stuff
                          }
                    });
             }
     });

要恢复我的代码,我的主要活动中有一个选项按钮,当我按下它时,它会改变布局,然后有多个按钮来激活颜色选择器。

为什么我的buttonsOption[0]是空引用?

更新

buttonMenuOption = findViewById(R.id.buttonOption)
buttonMenuOption.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
     setContentView(R.layout.graph_option);
     Button[] buttonsOption = new Button[nbObjects];
        for (int i = 0; i < nbObjects; i++) {
            final int j = i;
            buttonsOption[0] = findViewById(R.id.buttonOption0);
            buttonsOption[1] = findViewById(R.id.buttonOption1);
            buttonsOption[i].setOnClickListener(new View.OnClickListener() {
                    public void onClick(View v) {
                        //Do stuff
                      }
                });
         }
 });

3 个答案:

答案 0 :(得分:1)

问题发生在

product.product

在相关布局初始化之前声明。

因此您可能需要在buttonsOption[0] = findViewById(R.id.buttonOption0); buttonsOption[1] = findViewById(R.id.buttonOption1); 之后声明按钮引用,如下所示

setContentView(R.layout.graph_option);

答案 1 :(得分:0)

您在findViewById之前使用setContentView(),无法查找其他视图。您需要先将XML设置为活动的视图,然后调用findViewById < / p>

或者你可以做一些不同的事情,比如

buttonMenuOption = findViewById(R.id.buttonOption);
Button[] buttonsOption = new Button[nbObjects];
final View newContentView = LayoutInflater.from(this).inflate(R.layout.graph_option, null);
buttonsOption[0] = newContentView.findViewById(R.id.buttonOption0);
buttonsOption[1] = newContentView.findViewById(R.id.buttonOption1);
buttonMenuOption.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        setContentView(newContentView);
            for (int i = 0; i < nbObjects; i++) {
                final int j = i;
                    buttonsOption[i].setOnClickListener(new View.OnClickListener() {
                        public void onClick(View v) {
                            //Do stuff
                          }
                    });
             }
     });

答案 2 :(得分:-1)

是不是因为你声明了一个按钮数组但没有为数组的索引声明任何按钮?

如果buttonsOption [0]为null,我会声明数组,然后是按钮。

Button[] buttonsOption = new Button[nbObjects];

for(int i=0; i<nbObjects;i++){
    buttonOption[i] = new Button();
}