1.         Button btnChange = (Button) this.findViewById(R.id.btnChange); 
  
        btnChange.setOnClickListener(new View.OnClickListener() {   
            @Override  
            public void onClick(View v) {   
               //这里添加处理            }   
        });   
我想明白,上面代码第二行最后,这个new究竟新建了什么东西,是新建了一个函数?
而“View.OnClickListener() ”在这里起什么作用? 是完成 函数类型转换 吗?就是把后面大括号里面的函数转成这个函数?
可是为什么要完成这个转换呢?函数本来就只是一个入口地址,又不存在“类型”一说。2. 在main.xml中,指定id的时候,这个"@+id/txtview1"该作何理解? 我知道它的作用会在gen\R.java中生成一个txtview1的id,并且该id的值有编译器自动生成;可是 @+id 有无特殊含义? @+是不是表示 R.java中寻找的意思?
比如下面的:
<TextView android:id="@+id/txtview1"
    android:layout_width="200px"
    android:layout_height="wrap_content"
    android:text="Test marquee for TextView, which should be very long!!"
    android:layout_gravity="center"
    android:ellipsize="marquee"
    android:singleLine="true"
    android:focusable="true"
    android:marqueeRepeatLimit="marquee_forever"
    android:focusableInTouchMode="true"
    android:scrollHorizontally="true"
    />
 

解决方案 »

  1.   

    问题一:
    View.OnClickListener是一个类,或者是一个接口。所以这里new了一个类,产生了一个对象。
    由于View.OnClickListener里面有纯虚的函数,所以下面必须要实现onClick函数。这是java的风格,如果改为c++风格,则(大概实现一下):
    class A public View.OnClickListener
    {
    //重写
    public void onClick(View v) {   
      //这里添加处理 }   
      }
    };A a = new A;
    btnChange.setOnClickListener(a);
      

  2.   

    @+id/txtview1这就是规定了,其中@+必须(具体的我没详细研究),id就是在R.java里面产生一个叫做id的类,如下:
    public static final class id {
            public static final int content=0x7f050001;
            public static final int content2=0x7f050002;
            public static final int sv=0x7f050000;
        }你自己看R.java吧。后面的txtview1,当然就是变量名字了。
      

  3.   

    问题一:
    其实View.OnClickListener就是一个叫OnClickListener的接口,在View包里面。
    相当于c++的命名空间,如下:
    View::OnClickListener
      

  4.   

    接口、类和struct,这些东西并没有什么本质上的区别。
    类也可以有纯虚的,在c++里面并不区别类与接口(写代码也不区别)java里面有接口定义关键字,我估计,java里面的接口必须纯虚,而类必须没有纯虚。
    不过这些都不重要。就是一个类而已。OnClickListener的申明如下:
    public static interface
    View.OnClickListener...
    abstract void  onClick(View v)
    Called when a view has been clicked.
      

  5.   

    在eclipse里面,如果你new一个类,而这个类有纯虚函数,会编译不过,提示需要实现某纯虚函数,很简单,一看就明白了。
      

  6.   

    btnChange.setOnClickListener()括号中是要传进去一个OnClickListener类的,这个类负责监听btnChange按钮的状态,其实你完全可以新建一个OnClickListener类让后把它传进去,不过为了不那么麻烦,通常的做法是直接新建一个这样的类。这样应该能理解吧。深入了解java语言之后就会明白的。
    OnClickListener listener=new OnClickListener();
    btnChange.setOnClickListener(listener);
      

  7.   

    java语言中
    接口用interface修饰,其方法都是纯虚的,没有变量。
    如果一个类中有abstract函数,则整个类必须申明为abstract类型。
    其余就是普通类。所以,类中也可以有纯虚函数。
      

  8.   

    @+id/txtview1
    就是当txtview1这个ID不存在的时候,创建一个ID
      

  9.   

    第一个问题:其实在创建了一个匿名类设置到Button的监听器上,自己完全可以定义一个类A并实现监听器接口,然后用A定义一个变量a,再使用btnChange.setOnClickListener(a)这种形式设置事件监听器了。
    Java里面特有的一种匿名类使用方式,多用在事件监听器的设置上。
      

  10.   

     谢谢诸位,似乎了解了一点。那么,下面这第一行代码又是什么意思呢public class Main extends Activity implements android.view.View.OnClickListener {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
      

  11.   

    onCreate的套路代码,setContentView(R.layout.main)定义Activity的布局格式 通过R.layout.main来定义
      

  12.   

    btnChange.setOnClickListener()括号中是要传进去一个OnClickListener类的,这个类负责监听btnChange按钮的状态
      

  13.   

    貌似大神们已经把我想说的都说了。。
    个人感觉这个"@+id/txtview1就是自定义的一个符号吧,为了在程序里用到。
    看来有些我有点拿来主义了。有些原理东西我还得再学习学习。
      

  14.   


    1、如果LZ懂的C/C++的话,应该知道“回调函数”这个东东。
    “View.OnClickListener()”就跟回调函数中的函数地址一个性质。btnChange.setOnClickListener(new View.OnClickListener() {  
      @Override  
      public void onClick(View v) {  
      //这里添加处理 }  
      });   等价于:
    OnClickListener btnChangeClick =  new OnClickListener() {
    @Override
    public void onClick(View v) {
    }
    };    
    btnChange.setOnClickListener(btnChangeClick); 意思就是单击btnChange按钮时,将调用btnChangeClick.onClick()函数。
    2、@+id 表明想为一个控件定义一个ID,这个是Android的语法规定;
       txtview1 就是控件的名字。
      

  15.   

    第一个就是匿名内部类的事,先了解一下知识点。
    第二个@+id/,写法是固定的。我感觉+是增加或新建一个id到R文件的意思。像使用相对布局时,就直接用@id/指定相对的控件id。
      

  16.   

    应该是抽象结构,在java里面没有纯需函数的概念,c++里面才有
      

  17.   

    谢谢楼上的回复,两个问题基本都清楚了。
    但是,有朋友说这是回调函数,应该不是一码子事情吧?这倒搞得我有点迷糊了。另外,我想问的是,这里 又有个问题,implements后面是什么意思?public class Main extends Activity implements android.view.View.OnClickListener {
    }
      

  18.   

    从接口继承用implements,从类继承用extends
    c++里面统一用冒号加public/protected等来实现,比如:
    class A : public P
      

  19.   

    回调函数也是一个变量,和int i;差不多。
    只是回调函数可以被调用,也就是说,你先生成一个函数对象,把这个对象传给别人,别人在需要的时候,调用这个函数,这叫回调。
      

  20.   

    就是一个类中类,btnChange.setOnClickListener(new View.OnClickListener() {   
      @Override   
      public void onClick(View v) {   
      //这里添加处理 }   
      });   可以看成是这个:
    OnClickListener a= new OnClickListener() { 
    @Override
    public void onClick(View v) { 
    }
    };   
    btnChange.setOnClickListener(a); 
      

  21.   

    @+id 表明想为一个控件定义(增加)一个ID,
    当需要引用的时候,就不能再有+号了
      

  22.   


    @+id/xxx的+是指在R.id中查找有无名为xxx的常量,如果有,就覆盖了,没有,就增加一个。
      

  23.   

    问题一:楼主你可以这样来写会更好的理解
    Button btnChange = (Button) this.findViewById(R.id.btnChange); 
      
    btnChange.setOnClickListener(new MyOnClickListener());class MyOnClickListener implements OnClickListener{  
      @Override  
      public void onClick(View v) {  
      //这里添加处理 }  
      });
    那其实只是给你的按钮绑定一个监听器,当你按下按钮后要触发什么事件,可以写在onClick函数中
    问题二:
    你的理解和我的差不多,我想这是google的规范 我们照这样写就行了。
    哈哈我也是新手,共同学习阿 
      

  24.   


    那这个public class Main extends Activity implements android.view.View.OnClickListener
    等于是有两个父类,对吗?
      

  25.   

    什么纯虚函数?那是抽象方法好不!java里不叫函数 叫方法。
      

  26.   

    你看下源码,或者反编译下,可以大概看到
    View.OnClickListener是个静态接口,像上面的用法其实等同于你写一个实现接口的类,然后new一个这个类的对象作为setOnClickListener的参数我之前也是一直迷糊
      

  27.   

    java里面没有多继承的概念,只能继承一个父类,如果要实现多个父类里面的方法,就需要用到接口这个东东,实现接口就是通过implements来实现的。
    接口可以看成是比抽象类还抽象的类,接口的所有方法都不能有实现,只能有声明,也就是不能有大括号{};
      

  28.   

    楼主。。建议你去学习下java基础。
      

  29.   

    问题一:button里的方法setOnClickListener(OnClickListener a)用来给button注册一个click监听器,当发生click事件时执行其处理逻辑,跟回调函数类似。而这个监听器就是传入的参数a,这样看就跟普通的方法一样。不同的是这个监听器是一个接口,而接口是不能直接创建对象的,需要实现这个接口的虚方法onClick(View v),这个方法也就是你点击事件的处理逻辑。看26楼的写法,就是这个意思。
    //参数是一个对象,这个对象的类实现了接口OnClickListener,也就是重写了onClick(View v)方法
    //而这个方法就是点击事件的处理逻辑
    btnChange.setOnClickListener(new MyOnClickListener());class MyOnClickListener implements OnClickListener{   
      @Override   
      public void onClick(View v) {   
      //这里添加处理 }   
      });
    如果还看不懂,建议还是先学下java吧。
    问题二:@表示引用资源,@+id表示增加一个id。
      

  30.   

    第一个:那是个接口,后面的方法需要去实现
    第二个: @+id表示增加一个id,而@id表示引用已经有的id
      

  31.   

    小小建议:1)语法层面:《Java2实用教程(第三版).pdf》,它的第89/447页,和接口有关的匿名类
    2)Android层面:《深入浅出Android.pdf》 文件大小:586KB 文件总页数:89,它的第29/89页,获取标识ID。有时间,不妨看看,这两本书,都有电子档,csdn下载里有。