【问题标题】:Not sure what is happening in this java code example不确定这个 java 代码示例中发生了什么
【发布时间】:2014-04-17 07:51:23
【问题描述】:

我所指的代码示例是一些特定于 Android 的代码,但我感觉这个想法是 Java 中的一个基本概念。在下面的代码 sn-p 中,我对从第二行开始发生的事情感到困惑。看起来在 setOnClickListener() 方法中定义了一个全新的类。在我看来,一个方法是在另一个方法的参数中定义的,onClick() 是在 setOnClickListener() 中定义的。这整件事让我很困惑,因为我从来没有见过这样写的 Java,除了 Android。

谁能解释一下我在这里看到了什么?非常感谢任何帮助!

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));
        }
    }
});

【问题讨论】:

  • 谷歌匿名内部类。

标签: java android class methods overriding


【解决方案1】:

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

在您的情况下,OnClickListener 是一个接口,因此您必须将该接口中定义的函数实现到您的匿名类中。然后在您的操作发生时在函数中调用该实现的方法。 Java 的 Swing 库也大量使用匿名类。

所以要回答您的问题,正在发生的事情是正在创建一个新类,该类仅在此方法调用中使用 - 该类在其他任何地方都不可见(或可用)。总之,匿名类允许您从指定的类或接口创建自己的自定义类型。它使您可以更轻松地做很多事情,并且在您的行动中具有专长。

【讨论】:

  • 所以在本例中,我正在创建 OnClickListener 以在按下此按钮时执行特定操作,对吗?如果我想要一堆做同样事情的按钮,那么事先创建一个 OnClickListener 并将其传递给每个按钮的 setOnClickListener() 是否有意义?
  • 你明白了!只需创建一个自定义内部类,或者在一个新文件中,然后创建它的一个新实例。
【解决方案2】:

代码正在创建一个匿名内部类。 (谢谢,David。)基本上,它正在创建OnClickListener 类的新实例。这个类有很多方法,包括onClick(View v)。该类“监听”以查看如果有点击会发生什么,并调用onClick 方法。但是,该方法不执行任何操作。让它做某事的唯一方法是创建这个类的一个新实例,并将该方法定义为做某事。

【讨论】:

    【解决方案3】:

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

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

    int FX_KEY_CLICK : 键盘和方向键的点击声音

    所以当键盘按键被按下时,这行会播放按键的声音。

    然后 if 循环很简单,只需打印声音值

    【讨论】:

      猜你喜欢
      • 2018-07-28
      • 2018-11-12
      • 1970-01-01
      • 1970-01-01
      • 2015-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-09
      相关资源
      最近更新 更多