2016-08-16 112 views
0

我试图在我的应用程序中实现一个计数器,每次点击该按钮时都会增加。然后,我想要采取计数器的最终值,并将其显示在对话框中。有没有办法通过引用将成员函数传递给方法? [JAVA]

问题是,当我调用变量时,它返回最初有的值,而不是通过onClick方法修改的值(这很奇怪,但我在我的代码中评论了我的意思)。

final TextView points = (TextView) findViewById(R.id.points); 
    points.setText("Points = 0"); 

    class ButtonClick implements View.OnClickListener { 
     int value = 0; 
     public void onClick(View v) { 
      value++; 
      changeLocation(theButton); 
      points.setText("Points = " + value); // This value increases 
     } 

     public int getValue() { 
      return value; 
     } // This returns 0. 
    } 

    final ButtonClick buttonClicked = new ButtonClick(); 
    theButton.setOnClickListener(buttonClicked); 

    final int finalValue = buttonClicked.getValue(); // This still equals zero. 
+0

Java没有指针。 – shmosel

+0

Re,“//这仍然等于零。” _什么时候它仍然等于零?你的程序是否在某些方法中直接执行最后三行?也就是说,它是否创建了新的ButtonClick对象,进行注册,然后立即获得它的值?在这种情况下,它的价值当然是零!你还没有给用户任何时间点击按钮。 –

+0

@jameslarge我很傻,您的评论是让我得到正确答案的!我太早调用了getValue函数。 (对Java /第一个应用程序而言仍然是新的)。 –

回答

1

代码被执行同步逐行:

 // define and instantiate button listener 
1) final ButtonClick buttonClicked = new ButtonClick(); 
     // attach listener to button 
2) theButton.setOnClickListener(buttonClicked); 

      <------ here you still didn't executed onClick :) 

     // trying get value 
3) final int finalValue = buttonClicked.getValue(); // This still equals zero. 

当你打第3行,你所得到的值0,因为值为零。

尝试点击(执行点击 - >做事件或任何)然后获得价值。

要看看它是否工作,你需要第二个异步方法例如:

new Thread(new Runnable() { 

     @Override 
     public void run() { 

      while(buttonClicked.getValue() ==0) { 
        // you didn't click 

        Thread.sleep(10000); 
      } 
     }; 
}).start(); 
+0

它在那里;谢谢! –

0

有几个问题,我可以看到, 1)的onClick不是重写的方法,所以尽量@Override注释是这样的:

@Override 
public void onClick(View v) { ... } 

2)当一个变量是在班级级别使用getter和setter来声明它。

希望这些提示将有所帮助。

相关问题