我有一段我想要了解的代码,这是一个基于Java-Android的。
volumeControl.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress, 0);
}
});
在这段代码中,在括号内完成了@Override
方法,这是执行此代码的最佳方法,以及如何完成此操作。
java编译器如何理解这个构造函数调用。
有一个名为progress的int变量,它获取它的值,函数调用是如何完成的。
答案 0 :(得分:1)
在Android中有两种方法可以实现接口(在java中)。与您一样(匿名实施)或者您可以将implements OnSeekBarChangeListener
添加到您的班级签名中。当您使用类实现接口时,所有这些方法都将成为您的类方法。然后,您可以调用volumeControl.setOnSeekBarChangeListener(this)
,因为您的类实例正在实现所需的接口。
我认为两种实现方法的代码可读性都没有任何其他区别。
但请记住,当您想在匿名实现中使用方法变量时,应将它们声明为 final 。
public class SeekBarTestActivity extends AppCompatActivity implements SeekBar.OnSeekBarChangeListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_seek_bar_test);
SeekBar seekbar = (SeekBar) findViewById(R.id.seekBar);
seekbar.setOnSeekBarChangeListener(this);
}
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
// TODO add your implementation here
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO add your implementation here
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO add your implementation here
}
}
答案 1 :(得分:0)
它的工作方式是该方法应该是一个实现OnSeekBarChangeListener的类。
在volumeControl对象中,引用将保留给Listener。
每当volumeControl必须通知监听器时,它将使用该引用,这样就会通知监听器。
在这个特定的例子中,不是单独创建一个实现Listener的类,而是提供一个匿名内联实现。
这是在Swing或Android开发中处理此问题的非常典型的方法。它非常丑陋,但总是那样。
幸运的是Java 8打开了更好的方法来处理它(最后!!),这要归功于函数式编程,lambda,以及更通用的术语“函数指针”。
编辑(还不能写评论),作为评论的答案,请参阅 Function Pointers in Java