【问题标题】:Need help in understanding how this checkbox code works in Android需要帮助了解此复选框代码在 Android 中的工作原理
【发布时间】:2013-01-07 21:24:28
【问题描述】:
public class CheckBoxDemo extends Activity implements
    CompoundButton.OnCheckedChangeListener {
  CheckBox cb;

  @Override
  public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.main);

    cb=(CheckBox)findViewById(R.id.check);
    cb.setOnCheckedChangeListener(this);
  }

  public void onCheckedChanged(CompoundButton buttonView,
                               boolean isChecked) {
    if (isChecked) {
      cb.setText(R.string.checked);
    }
    else {
      cb.setText(R.string.unchecked);
    }
  }
}

我难以理解的是,这条线在传入这个参数时究竟是如何工作的

cb.setOnCheckedChangeListener(this);

另外,onCheckedChanged 方法没有在任何地方显式调用,Android 如何建立连接以将复选框状态连接到方法名称。

【问题讨论】:

    标签: java android android-intent android-widget


    【解决方案1】:

    您正在代码中实现接口和onCheckedChanged() 是。您的 Activity 现在也是 Listener。

    当你实现一个接口时,你还必须重写接口指定的方法。这意味着实现该接口的类现在可以充当该接口的实例。

    public class CheckBoxDemo extends Activity implements
    CompoundButton.OnCheckedChangeListener {
    

    您的CheckBoxDemo 类实现了OnCheckedChangeListener,因此如果需要,它现在可以充当OnCheckedChangeListener。

    然后在你的代码中你有

    public void onCheckedChanged
    

    CheckBoxDemo 需要实现接口中的哪个方法才能使一切正常工作。

    因此,您现在可以使用this(指您当前的CheckBoxDemo 实例)传递给setOnCheckedChangeListener (),因为满足所有先前的条件 - 您的类现在可以成功侦听检查事件。

    有关更多信息,请阅读 java 教程中的 Interfaces。

    【讨论】:

      【解决方案2】:

      当你声明你的类时,它会从 CompoundButton 类中实现一个名为 OnCheckedChangeListener 的 Interface

      implements
          CompoundButton.OnCheckedChangeListener 
      


      当您使用 this 时,它指的是您正在使用的 this 对象,它是 OnCheckedChangeListener 的一个实例。
      当您实现Interface 并且Interface 具有方法时,您的Activity(或任何具有该方法的类)必须实现该方法。在您的情况下,它是onCheckedChanged(),因此您的 JVM 会知道建立这种关系。

      【讨论】:

        【解决方案3】:

        您可以查找CheckBox 的源代码,但大致是这样工作的(这不是代码的摘录,而是对其外观的演示):

        public class CheckBox implements ... {
          private OnCheckedChangeListener occl;
          public void setOnCheckedChangeListener(OnCheckedChangeListener newlistener) {
            occl = newlistener;
          }
          /* this will be called when you click the CheckBox */
          public void check(...) {
              /* draw the check mark and similar things, then: */
              occl.onCheckedChanged(...);
          }
        }
        

        所以您的onCheckedChanged() 实际上是由您的Component 的内部实现调用的,在这种情况下是您的CheckBox。

        【讨论】:

          猜你喜欢
          • 2021-12-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-04
          • 2021-02-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多