private Button.OnClickListener calcBMI = new Button.OnClickListener()看不懂?package com.demo.android.bmi;import java.text.DecimalFormat;import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;public class Bmi extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        findViews();
        setListensers();
    }
    
    private Button button_calc;
    private EditText field_height;
    private EditText field_weight;
    private TextView view_result;
    private TextView view_suggest;
    private void findViews()
    {
     button_calc = (Button)findViewById(R.id.submit);
     field_height = (EditText)findViewById(R.id.height);
     field_weight = (EditText)findViewById(R.id.weight);
     view_result = (TextView)findViewById(R.id.result);
     view_suggest = (TextView)findViewById(R.id.suggest);
    }
    private void setListensers()
    {
     button_calc.setOnClickListener(calcBMI);
    }
    //?
    private Button.OnClickListener calcBMI = new Button.OnClickListener()
    {
     public void onClick(View arg0)
     {
     DecimalFormat nf = new DecimalFormat("0.00");
     double height = Double.parseDouble(field_height.getText().toString())/100;
     double weight = Double.parseDouble(field_weight.getText().toString());    
     double BMI = weight / (height * height);
     view_result.setText(getText(R.string.bmi_result) + nf.format(BMI));
    
     //Give health advice
     if (BMI > 25)
     {
     view_suggest.setText(R.string.advice_heavy);
     }
     else if (BMI < 20)
     {
     view_suggest.setText(R.string.advice_light);
     }
     else
     {
     view_suggest.setText(R.string.advice_average);
     }
     }
    };
}

解决方案 »

  1.   

    OnClickListener明明不是Button的成员。为何可以写成Button.OnClickListener?
      

  2.   

    Button.OnClickListener相当于一个接口,但看起来,Button本身没有OnClickListener这个接口。android.view.View.OnClickListener说明OnClickListener这个接口是属于View的。implements Button.OnClickListener这句话为何不报错?Button.OnClickListener calcBMI = new myListenner();
    private class myListenner implements Button.OnClickListener
    {
    public void onClick(View arg0)
    {
    DecimalFormat nf = new DecimalFormat("0.00");
    double height = Double.parseDouble(field_height.getText().toString())/100;
    double weight = Double.parseDouble(field_weight.getText().toString());    
    double BMI = weight / (height * height);
    view_result.setText(getText(R.string.bmi_result) + nf.format(BMI));

    //Give health advice
    if (BMI > 25)
    {
    view_suggest.setText(R.string.advice_heavy);
    }
    else if (BMI < 20)
    {
    view_suggest.setText(R.string.advice_light);
    }
    else
    {
    view_suggest.setText(R.string.advice_average);
    }
    openOptionsDialog2();
    }
    };
      

  3.   

    Button m_Button=(Button)findViewById(R.id.Button01);
    m_Button.setOnClickListener(caculation);
    }
    private OnClickListener calculation = new Button.OnClickListener()
    {}一个菜鸟的理解: 这个问题真好,不知道会不会有更深入的探讨。
      
        原来的接口,当对象用起来了。 后面之所以没有View.   或者Button.  觉得和强制转换差不多
      

  4.   

    将Button更改成EditText也是运行正确的!EditText.OnClickListener calcBMI = new myListenner();
    private class myListenner implements EditText.OnClickListener

    private TextView.OnClickListener calcBMI = new TextView.OnClickListener()
    均没问题。看起来,像个修饰符。
      

  5.   

    public class Button 继承了android.view.View类,Inherited Methods中有setOnClickListener(View.OnClickListener l)
      

  6.   


    Button继承view的,view有这个函数成员的
      

  7.   

    直接继承public的成员函数,怎么会报错呢,多态的表现
      

  8.   

    按F1出来的帮助(得联internet),Button是View的子子类。现在明白多了!java.lang.Object 
       ↳ android.view.View 
         ↳ android.widget.TextView 
           ↳ android.widget.Button 
      

  9.   

    我想实例化implements View.OnClickListener之后,应该都可以的。控件一般都是View的后代。
      

  10.   


    class Button{
    OnClickListener tl;
    public interface OnClickListener{
    public void onClick();
    }
    public void setOnClickListener(OnClickListener l)
    {
    this.tl=l;
    }

    public void click(){
    tl.onClick();
    }
    }
    public class TestMain{
    public static void main(String[] args){
    Button b=new Button();
    b.setOnClickListener(new Button.OnClickListener(){
       public void onClick(){
    System.out.println("buttonclick");
    }
    });
    b.click();
    }
    }
    相当于匿名内部类,在new Button.OnClickListener(){}的时候实现了一个匿名的类
      

  11.   

    呵呵,看来功能java语法想通的!
      

  12.   

    [2011-08-10 07:41:26 - BMI] Starting activity com.demo.android.bmi.Bmi on device emulator-5554
    [2011-08-10 07:41:27 - BMI] Installation error: INSTALL_FAILED_INSUFFICIENT_STORAGE
    [2011-08-10 07:41:27 - BMI] Please check logcat output for more details.
    [2011-08-10 07:41:28 - BMI] Launch canceled!
    [2011-08-10 07:41:38 - BMI] Installation error: INSTALL_FAILED_INSUFFICIENT_STORAGE
    [2011-08-10 07:41:38 - BMI] Please check logcat output for more details.
    [2011-08-10 07:41:38 - BMI] Launch canceled!执行版主的例子出现这种错误是怎么回事??
      

  13.   

    Button继承了View类,也应该有View.OnClickListener;
    为何Button.OnClickListener呢!
      

  14.   

    是不是这样的:View中的OnClickListener接口定位静态的,Button继承View之后,也就有了这个接口。
      

  15.   

    button继承了TextView,而TextView继承了View,所以button.OnClickListener是不会报错的。我个人觉得,直接写new onclicklistener()也是一样的,因为view的子类并没有对这个接口重写。