为什么要将(EditText)findViewById转换为(EditText)?

时间:2013-11-02 01:20:59

标签: java android

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

findViewById返回需要投放的内容是什么?

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

malloc(numberOfBytesYouNeed);

现在malloc所做的是它为您保留所请求的字节数(如果可用)并返回指向已分配的内存块的起始地址的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),她肯定会理解。但由于她不会说德语,她会用印地语回复。现在,即使她的答案是肯定的,对你来说也没什么用处。你需要的是一个转换器,用于将她的答案(用印地语(View Object))转换(类型转换)为你能理解的东西,即德语(EditText对象)

希望答案有所帮助!

答案 3 :(得分:0)

自API 26起,可能不再需要演员。 documentation现在声明了

  

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

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

<T extends View> T  findViewById(int id)

this answer.

中所述