我遇到了一个不应该发生的奇怪的if条件逻辑流程。
基本上,类listenOn(...)
中的方法Click
不应继续创建侦听器的新实例。一个是足够好的,所以我要防范那些不必要的创作。
但是,当我在所有MainActivity
之前的setOnClickListener
中设置一个简单的测试来检查listenOn(...)
方法时,我看到对该方法的第一次调用就像打算,第二次似乎有效...
...除了 return
出现在true子句中之外,它直接跳到false子句的return
;但是,跳过了新Listener的创建。
我无法理解为什么会这样做。我的代码中有一个错误,因为无论我按哪个按钮,它只进行除法操作。我添加了Generics,这个问题可能来自那个。
顺便说一下,我正在尝试不同的方法来创建听众。我不是在寻找“最好的方法”,或“标准方式”,我希望学习不同的东西,所以不要攻击我用来创建监听器的方法。
如果你能解释一下我想要...
if-statment的行为
和
为什么我点击任何按钮
时才会发生分组public class Click<T extends Operation> {
private T operation;
private View.OnClickListener listener;
public Click(T operation) {
this.operation = operation;
}
public View.OnClickListener listenerOn(final MainActivity UI) {
// ******************************************************
// First pass - goes to false-clause, and returns that new listener
// Second pass - goes to true-clause, returns the old listener, and then goes to the
// false-clause and returns the listener; however, it skips the creation of
// the new View.OnClickListener. Why??
// ******************************************************
if (listener != null) {
return listener;
} else {
listener = new View.OnClickListener() {
@Override
public void onClick(View v) {
double total, num1, num2;
num1 = Double.parseDouble(UI.txtNumber1.getText().toString());
num2 = Double.parseDouble(UI.txtNumber2.getText().toString());
total = operation.execute(num1, num2);
UI.txtResult.setText(Double.toString(total) + " -v5");
}
};
return listener;
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnAdd = (Button) findViewById(R.id.btnAddition);
Button btnSub = (Button) findViewById(R.id.btnSubtract);
Button btnMul = (Button) findViewById(R.id.btnMultiple);
Button btnDiv = (Button) findViewById(R.id.btnDivide);
txtNumber1 = (EditText) findViewById(R.id.txtNumber1);
txtNumber2 = (EditText) findViewById(R.id.txtNumber2);
txtResult = (EditText) findViewById(R.id.txtResult);
// Testing - Checks the if-conditional of listenerOn()
// ******************************************************
Click click = new Click<>(Add.OPERATION);
View.OnClickListener listener = click.listenerOn(this);
listener = click.listenerOn(this);
// ******************************************************
btnAdd.setOnClickListener(new Click<>(Add.OPERATION).listenerOn(this));
btnSub.setOnClickListener(new Click<>(Subtract.OPERATION).listenerOn(this));
btnDiv.setOnClickListener(new Click<>(Divide.OPERATION).listenerOn(this));
btnMul.setOnClickListener(new Click<>(Multiply.OPERATION).listenerOn(this));
}