2014-03-12 118 views
1

的代码示例,我指的是发生了一点点的Android特定的代码,但我有一种感觉,想法是Java中的一个根本性的。在下面的代码片段中,我对第二行的内容感到困惑。它看起来像在setOnClickListener()方法中正在定义一个全新的类。它看起来像一个方法被定义在另一个方法的参数中,onClick()被定义在setOnClickListener()中。整个事情对我来说非常混乱,因为我从来没有见过像这样写的Java,除了Android。不知道是什么原因在此Java代码示例

可能有人请解释什么,我这里看到的?任何帮助是极大的赞赏!

final Button downButton = (Button) findViewById(R.id.button1); 
downButton.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     //Play key click sound 
     mAudioManager.playSoundEffect(AudioMAnager.FX_KEY_CLICK); 

     if (mVolumne > mVolumeMin) { 
      mVolume -= 2; 
      tv.setText(String.valueOf(mVolume)); 
     } 
    } 
}); 
+9

谷歌匿名内部类。 –

+0

会做。谢谢! – intA

回答

3

setOnClickListener(),一类新的被定义。这就是所谓的匿名课程。匿名类用于定义快速新类型,这些类型对每个方法调用执行特定的和不同的操作,例如对点击执行的操作。匿名类总是隐式地扩展大括号从对象的新实例脱离的类。为了使这更容易理解:new OnClickListener() {...OnClickListener是你新的匿名类的父类(或接口)。

在你的情况,OnClickListener是一个接口,因此,你必须实现该接口定义到您的匿名类的功能。当你的行为发生时,那个实现的方法在函数中被调用。 Java的Swing库也大量使用匿名类。

因此,要回答你的问题,正在发生的事情是创建一个新的类,即只在这个方法调用中使用 - 这个类是不可见(或可用的)其他地方。总之,匿名类允许您从指定的类或接口创建自己的自定义类型。它可以让你做很多事情更容易,并在你的行动中有专长。

+0

所以在这个例子中,我正在推动OnClickListener在按下这个按钮时做一些特定的事情,对吗?如果我想要一堆做同样事情的按钮,事先创建一个OnClickListener并将其传递给每个按钮的setOnClickListener()会有意义吗? – intA

+0

你懂了!只需创建一个自定义的内部类,或者创建一个新文件,并创建一个新的实例。 – Arbiter

2

该代码正在创建一个匿名内部类。 (谢谢大卫。)基本上,它正在创造一个新的类别实例OnClickListener。这门课有很多方法,包括onClick(View v)。该类会“侦听”以查看点击后会发生什么情况,并调用onClick方法。但是,该方法没有做任何事情。让它做某事的唯一方法是创建这个类的新实例,并将该方法定义为做某件事。

1

按钮被点击时的onClick()函数被调用

AudioManager提供到音量和振铃模式控制访问。

INT FX_KEY_CLICK:键盘和方向键的点击声

当按下键盘键这条线将起到关键的声音。

,然后如果环是容易只是打印声音值

相关问题