5

我开始学习Android编程。当您声明类型的对象EditText并稍后对其进行初始化时,为什么要将findViewById的内容转换为EditText

findViewById需要铸造什么回报?

4

4 回答 4

4

正如 daniel_c05 所指出的,findViewById返回类型是View(它是可视小部件的父类EditText和其他类)。

在 Java 中,在这种情况下,您需要强制转换为特定类型——这是语言的要求。

于 2013-11-02T05:55:12.523 回答
0

findViewById 从在 onCreate(Bundle) 中处理的 XML 中查找由 id 属性标识的视图。参考-: http: //developer.android.com/reference/android/app/Activity.html#findViewById(int)

于 2013-11-02T06:02:42.400 回答
0

我不知道你有多少不同语言的编程经验。但这是在许多语言中相当使用的概念。这几乎是非常合乎逻辑的。让我用 2 种方法来解释这一点:-

1) 如果你有任何 C 编码经验,你会发现它非常相似。因此,在 C 语言中,假设当您使用 malloc() 分配一块内存时,您只需说

malloc(numberOfBytesYouNeed);

现在 malloc 所做的是它为您保留请求的字节数(如果可用)并返回一个 void * 指向已分配内存块的起始地址。

现在,尽管您有 void 指针,但您仍然希望访问以某种方式分配的内存。正确的 ?因此,您可能希望使用比例因子 2(对于整数)或 1(对于字符)等来访问分配的内存。

此外,只有将 malloc() 返回的指针分配给您自己的指针之一,您才能访问它。现在正如我上面提到的,如果你想在新分配的内存中存储 2 字节整数,那么要访问这个整数内存数组,你需要一个整数指针。

由于您需要一个整数指针,因此您必须将 malloc() 返回的 void 指针分配给您的整数指针。像这样的东西:-

int * myPointer= malloc(numberOfBytesYouNeed);

但根据语言语义,这将是一个编译时错误。因为您只能将相似的指针分配给彼此。

因此,您需要将 malloc() 返回的 void * 类型转换为 int * 。像这样的东西:-

int * myPointer= (int*)malloc(numberOfBytesYouNeed);

现在类似的是 Android(或任何其他编程语言)中的概念。正如上面其他人所解释的,findViewById 返回类型是 View(它是 EditText 的父类和可视小部件的其他类)。但是,由于您实际上希望将 findViewById 返回的这个 View 对象作为 EditText 对象来访问,因此您需要将其类型转换为一个。

2)现在另一个例子,将是非常基本的。假设您只知道说德语。现在你碰巧遇到了一个只会说印地语的辣妹。但她确实懂德语。现在如果你用德语问她,她是否有兴趣和你约会,(findViewById),她一定会明白的。但由于她不会说德语,她会用印地语回复。现在,即使她的回答是肯定的,它对你也没有多大用处。您需要的是翻译器将她的答案(在印地语(查看对象)中)转换(打字)成您可以理解的内容,即德语(EditText 对象)

希望答案有帮助!

于 2014-04-17T20:35:49.163 回答
0

从 API 26 开始,可能不再需要强制转换。该文档现在指出

注意:在大多数情况下——取决于编译器的支持——结果视图会自动转换为目标类类型。如果目标类类型不受约束,则可能需要显式强制转换。

这是因为返回类型现在是:

<T extends View> T  findViewById(int id)

本答案所述。

于 2018-04-07T13:02:32.980 回答