Android的几个很基本问题。100分送上!!

时间:2022-04-15 04:42:11
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"
    />


 

39 个解决方案

#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


谢谢楼上,不过我还不是太清楚,

问题1. 究竟是类 还是接口?  哪位能再给说说

#5


接口、类和struct,这些东西并没有什么本质上的区别。
类也可以有纯虚的,在c++里面并不区别类与接口(写代码也不区别)

java里面有接口定义关键字,我估计,java里面的接口必须纯虚,而类必须没有纯虚。
不过这些都不重要。就是一个类而已。

OnClickListener的申明如下:
public static interface
View.OnClickListener

...
abstract void  onClick(View v)
Called when a view has been clicked.

#6


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

#7


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

#8


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

所以,类中也可以有纯虚函数。

#9


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

#10


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

#11


 谢谢诸位,似乎了解了一点。那么,下面这第一行代码又是什么意思呢



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

#12


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

#13


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

#14


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

#15



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 就是控件的名字。

#16


该回复于2011-02-23 09:50:24被版主删除

#17


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

#18


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

#19


谢谢楼上的回复,两个问题基本都清楚了。
但是,有朋友说这是回调函数,应该不是一码子事情吧?这倒搞得我有点迷糊了。

另外,我想问的是,这里 又有个问题,implements后面是什么意思?

public class Main extends Activity implements android.view.View.OnClickListener {

。。。
}

#20


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

#21


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

#22


就是一个类中类,



btnChange.setOnClickListener(new View.OnClickListener() {   
  @Override   
  public void onClick(View v) {   
  //这里添加处理 }   
  });   

可以看成是这个:
OnClickListener a= new OnClickListener() { 
@Override
public void onClick(View v) { 
}
};   
btnChange.setOnClickListener(a); 

#23


该回复于2011-02-23 15:22:14被版主删除

#24


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

#25


引用 1 楼 yang79tao 的回复:
问题一:
View.OnClickListener是一个类,或者是一个接口。所以这里new了一个类,产生了一个对象。
由于View.OnClickListener里面有纯虚的函数,所以下面必须要实现onClick函数。

这是java的风格,如果改为c++风格,则(大概实现一下):
class A public View.OnClickListener
{
//重写
public……


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

#26


问题一:楼主你可以这样来写会更好的理解
Button btnChange = (Button) this.findViewById(R.id.btnChange); 
  
btnChange.setOnClickListener(new MyOnClickListener());

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

#27


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


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

#28


该回复于2011-02-23 17:24:02被版主删除

#29


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

#30


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

我之前也是一直迷糊

#31


Listener当然是接口了~~

#32


我也补补基础知识 

#33


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

#34


该回复于2011-02-24 09:47:30被版主删除

#35


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

#36


问题一: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。

#37


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

#38


该回复于2011-02-24 13:36:24被版主删除

#39


小小建议:

1)语法层面:《Java2实用教程(第三版).pdf》,它的 第89/447页,和接口有关的匿名类
2)Android层面:《深入浅出Android.pdf》 文件大小:586KB 文件总页数:89,它的 第29/89页,获取标识ID。

有时间,不妨看看,这两本书,都有电子档,csdn下载里有。

#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


谢谢楼上,不过我还不是太清楚,

问题1. 究竟是类 还是接口?  哪位能再给说说

#5


接口、类和struct,这些东西并没有什么本质上的区别。
类也可以有纯虚的,在c++里面并不区别类与接口(写代码也不区别)

java里面有接口定义关键字,我估计,java里面的接口必须纯虚,而类必须没有纯虚。
不过这些都不重要。就是一个类而已。

OnClickListener的申明如下:
public static interface
View.OnClickListener

...
abstract void  onClick(View v)
Called when a view has been clicked.

#6


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

#7


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

#8


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

所以,类中也可以有纯虚函数。

#9


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

#10


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

#11


 谢谢诸位,似乎了解了一点。那么,下面这第一行代码又是什么意思呢



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

#12


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

#13


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

#14


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

#15



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 就是控件的名字。

#16


该回复于2011-02-23 09:50:24被版主删除

#17


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

#18


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

#19


谢谢楼上的回复,两个问题基本都清楚了。
但是,有朋友说这是回调函数,应该不是一码子事情吧?这倒搞得我有点迷糊了。

另外,我想问的是,这里 又有个问题,implements后面是什么意思?

public class Main extends Activity implements android.view.View.OnClickListener {

。。。
}

#20


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

#21


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

#22


就是一个类中类,



btnChange.setOnClickListener(new View.OnClickListener() {   
  @Override   
  public void onClick(View v) {   
  //这里添加处理 }   
  });   

可以看成是这个:
OnClickListener a= new OnClickListener() { 
@Override
public void onClick(View v) { 
}
};   
btnChange.setOnClickListener(a); 

#23


该回复于2011-02-23 15:22:14被版主删除

#24


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

#25


引用 1 楼 yang79tao 的回复:
问题一:
View.OnClickListener是一个类,或者是一个接口。所以这里new了一个类,产生了一个对象。
由于View.OnClickListener里面有纯虚的函数,所以下面必须要实现onClick函数。

这是java的风格,如果改为c++风格,则(大概实现一下):
class A public View.OnClickListener
{
//重写
public……


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

#26


问题一:楼主你可以这样来写会更好的理解
Button btnChange = (Button) this.findViewById(R.id.btnChange); 
  
btnChange.setOnClickListener(new MyOnClickListener());

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

#27


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


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

#28


该回复于2011-02-23 17:24:02被版主删除

#29


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

#30


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

我之前也是一直迷糊

#31


Listener当然是接口了~~

#32


我也补补基础知识 

#33


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

#34


该回复于2011-02-24 09:47:30被版主删除

#35


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

#36


问题一: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。

#37


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

#38


该回复于2011-02-24 13:36:24被版主删除

#39


小小建议:

1)语法层面:《Java2实用教程(第三版).pdf》,它的 第89/447页,和接口有关的匿名类
2)Android层面:《深入浅出Android.pdf》 文件大小:586KB 文件总页数:89,它的 第29/89页,获取标识ID。

有时间,不妨看看,这两本书,都有电子档,csdn下载里有。