好的,我刚刚开始在Eclipse中编写一些android,我对此有点傻眼。以下是本书中编写按钮编程的两种方法,它们都工作正常,除了第一种看起来更简单和更短。哪个更好,为什么?
View newButton = findViewById(R.id.main_new_button);
newButton.setOnClickListener(this);
Button newButton= (Button) this.findViewById(R.id.main_new_button);
newButton.setOnClickListener(this);
答案 0 :(得分:1)
这两种形式是等价的。在这两种情况下,findViewById
都返回一个View
对象,唯一的区别是在第二个版本中,对Button
的子类View
进行了显式强制转换。
正如您在documentation中看到的那样,View
是TextView
的超类,而TextView
是Button
的超类。
哪一个更好?这取决于。如果您需要使用特定于Button
的功能,则首选第二种方式。另一方面,如果View
对象足够,则使用第一种方式。
答案 1 :(得分:1)
我喜欢你的思维方式。在android中,每个小部件都是view.I将告诉你的步骤 -
首先重要的是每个按钮都是视图,但不一定每个视图都应该按下
View newButton = findViewById(R.id.main_new_button);
newButton.setOnClickListener(this);
你正在使用它并不意味着newButton总是一个Button.We可以将任何View引用(例如LinearLayout,ImageButton等)stroe到newButton
但在第二种情况下
Button newButton= (Button) this.findViewById(R.id.main_new_button);
newButton.setOnClickListener(this);
如果R.id.main_new_button是XML中的按钮ID,那么newButton肯定应该是Button
正如我所说,我们知道每个Button都是View但我们不知道哪个View是button.That它要求你施放findViewByid.And你的第一个案例不鼓励因为每个视图都有自己的方法,如果我们推广它们就无法使用这个观点。所以我们必须专门使用Button。
希望你明白了
答案 2 :(得分:0)
Button是一个扩展TextView的小部件。 TextView扩展了View。如果您使用Button类,您将接触到更具体的成员函数,而不是前面提到的超类。至于那些特定的方法是什么......你将不得不进入android.widget.Button类来探索那个=)。执行此操作后,我看到的只有三个构造函数(用于显式声明按钮) - 所有其他成员函数都是相同的。
public Button(android.content.Context context);
public Button(android.content.Context context, android.util.AttributeSet attrs);
public Button(android.content.Context context, android.util.AttributeSet attrs, int defStyle);
但是,如果您在3个月后回到此代码时不想让自己混淆,或者其他开发人员与您一起工作,第二种方法是使用正确的方法:
Button newButton= (Button) this.findViewById(R.id.main_new_button);
newButton.setOnClickListener(this);
答案 3 :(得分:0)
如果你想要一个按钮,你需要后一种形式。前一种形式是好的,但它不是完美的方法。因为视图的用法不仅仅是按钮。
答案 4 :(得分:0)
在第二种情况下,您已将结果转换为正确的类型。这允许您访问特定方法Button
。第一个只返回一个View
对象,尽管它是Button
。因此,您无权访问Button
特定功能。
答案 5 :(得分:0)
View构建的按钮是视图,而不是按钮小部件。如果从View类创建按钮,则无法调用Button类的功能。 View Class和Button Class都有“setOnClickListener”函数,但View Class的函数与Button的函数不同。