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

Featured 2011-02-22 07:59:36
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"
/>


...全文
404 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
中才德创 2011-03-27
  • 打赏
  • 举报
回复
小小建议:

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

有时间,不妨看看,这两本书,都有电子档,csdn下载里有。
icoo000 2011-02-24
  • 打赏
  • 举报
回复
第一个:那是个接口,后面的方法需要去实现
第二个: @+id表示增加一个id,而@id表示引用已经有的id

大掌教 2011-02-24
  • 打赏
  • 举报
回复
问题一: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。
小裴同学 2011-02-24
  • 打赏
  • 举报
回复
楼主。。建议你去学习下java基础。。。。
ameyume 2011-02-23
  • 打赏
  • 举报
回复
java里面没有多继承的概念,只能继承一个父类,如果要实现多个父类里面的方法,就需要用到接口这个东东,实现接口就是通过implements来实现的。
接口可以看成是比抽象类还抽象的类,接口的所有方法都不能有实现,只能有声明,也就是不能有大括号{};
bigpretty 2011-02-23
  • 打赏
  • 举报
回复
应该是抽象结构,在java里面没有纯需函数的概念,c++里面才有
念茜 2011-02-23
  • 打赏
  • 举报
回复
我也补补基础知识
知道分子 2011-02-23
  • 打赏
  • 举报
回复
第一个就是匿名内部类的事,先了解一下知识点。
第二个@+id/,写法是固定的。我感觉+是增加或新建一个id到R文件的意思。像使用相对布局时,就直接用@id/指定相对的控件id。
hslinux 2011-02-23
  • 打赏
  • 举报
回复

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 就是控件的名字。
athrunzalatt 2011-02-23
  • 打赏
  • 举报
回复
貌似大神们已经把我想说的都说了。。
个人感觉这个"@+id/txtview1就是自定义的一个符号吧,为了在程序里用到。
看来有些我有点拿来主义了。有些原理东西我还得再学习学习。
whatwhy83 2011-02-23
  • 打赏
  • 举报
回复
btnChange.setOnClickListener()括号中是要传进去一个OnClickListener类的,这个类负责监听btnChange按钮的状态
筱周 2011-02-23
  • 打赏
  • 举报
回复
onCreate的套路代码,setContentView(R.layout.main)定义Activity的布局格式 通过R.layout.main来定义
幻影浪子 2011-02-23
  • 打赏
  • 举报
回复
Listener当然是接口了~~
lionfox 2011-02-23
  • 打赏
  • 举报
回复
你看下源码,或者反编译下,可以大概看到
View.OnClickListener是个静态接口,像上面的用法其实等同于你写一个实现接口的类,然后new一个这个类的对象作为setOnClickListener的参数

我之前也是一直迷糊
dhzhen2008 2011-02-23
  • 打赏
  • 举报
回复
什么纯虚函数?那是抽象方法好不!java里不叫函数 叫方法。
Featured 2011-02-23
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 yang79tao 的回复:]
从接口继承用implements,从类继承用extends
c++里面统一用冒号加public/protected等来实现,比如:
class A : public P
[/Quote]

那这个public class Main extends Activity implements android.view.View.OnClickListener
等于是有两个父类,对吗?
bjtu1005 2011-02-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的规范 我们照这样写就行了。
哈哈我也是新手,共同学习阿
huyanqi 2011-02-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yang79tao 的回复:]

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

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

@+id/xxx的+是指在R.id中查找有无名为xxx的常量,如果有,就覆盖了,没有,就增加一个。
fu_shuwu 2011-02-23
  • 打赏
  • 举报
回复
@+id 表明想为一个控件定义(增加)一个ID,
当需要引用的时候,就不能再有+号了
hongliang_wu 2011-02-23
  • 打赏
  • 举报
回复
就是一个类中类,



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

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

加载更多回复(14)

80,349

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧