使用Lambda设置OnCheckedChangeListener

时间:2018-10-17 16:43:21

标签: java android lambda

我想对OnCheckedChangeListener使用lambda而不是匿名类。

用于设置侦听器的原始代码可以正常工作并读取:

mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
        mCrime.setSolved(isChecked);
    }
});

我尝试通过以下方式将其更改为lambda:

mCheckBox.setOnCheckedChangeListener(l -> mCrime.setSolved(isChecked));

但是我收到来自Android Studio的错误消息:选中了无法解析符号。

我曾想过,即使onCheckChanged接受两个参数,lambda也会隐式解析isChecked。我的理解有什么问题?

3 个答案:

答案 0 :(得分:2)

您的语法错误。您所拥有的甚至都不应该编译。使用这个:

mCheckBox.setOnCheckedChangeListener((view, isChecked) -> mCrime.setSolved(isChecked));

->之前的内容并不代表侦听器,而是代表在该侦听器中传递的参数,在这种情况下为View和boolean。

答案 1 :(得分:0)

setOnCheckedChangeListener有两个参数

CompoundButton buttonView, boolean isChecked,因此lambda语句应为

mCheckBox.setOnCheckedChangeListener(buttonView, isChecked -> mCrime.setSolved(isChecked))

话虽这么说,我对Java lambda并不十分了解,无法知道它是否可以处理多个参数。

答案 2 :(得分:0)

isChecked只是一个参数名称,当您使用lambda时不存在,但是这里是带有onCheckChangeListener参数名称的正确lambda

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="style/style.css">
<title>FileReader</title>
</head>
<body>
<h1>FileReader</h1>
<input type='file' accept='text/plain' onchange='openFile(event)'><br>
Input: <input type="text" id="qi" value="">
<br></br>
<button onclick="check()" class="button buttonB">Check</button>
<p id="ans"></p>
<p id=".same"></p>
<script src="main.js"></script>
</body>
</html>



function check(){
  var text = document.getElementById("qi").value;
  console.log(`Text: ${text}`);

  var perf;       //The value should be `file`

  if (text === perf){
      console.log("Same");
      document.getElementById(".same").innerHTML = "Same";
  } else{
      console.log("Not Same!!!")
      document.getElementById(".same").innerHTML = "Not Same!!!";
  }
}

function openFile(event) {
var input = event.target;
var reader = new FileReader();
reader.onload = function(){
var file = reader.result;
console.log(file);
document.getElementById("ans").innerHTML = file;
};
reader.readAsText(input.files[0]);
};