【问题标题】:Why do you cast (EditText) findViewById to (EditText)?为什么将 (EditText) findViewById 转换为 (EditText)?
【发布时间】:2013-11-02 01:20:58
【问题描述】:

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

findViewById 返回需要强制转换的内容是什么?

【问题讨论】:

标签: java android


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我不知道你有多少不同语言的编程经验。但这是在许多语言中相当常用的概念。这几乎是非常合乎逻辑的。让我用 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 对象)

      希望答案有帮助!

      【讨论】:

        【解决方案4】:

        从 API 26 开始,可能不再需要强制转换。 documentation 现在状态

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

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

        <T extends View> T  findViewById(int id)
        

        this answer.中所述

        【讨论】:

          猜你喜欢
          • 2016-05-30
          • 2021-12-30
          • 2013-02-08
          • 2020-10-10
          • 1970-01-01
          • 1970-01-01
          • 2020-12-11
          • 2017-08-02
          • 1970-01-01
          相关资源
          最近更新 更多