【问题标题】:Android what is the need to cast return of findViewById()?Android 有什么需要强制返回 findViewById()?
【发布时间】:2017-11-04 14:28:31
【问题描述】:

要在 Android findViewById() 中从 XML 获取 View,假设是 ListView

由于findViewById()返回的是父View对象而不是ListView对象,我们需要强制转换findViewById()的返回

ListView listView = (ListView) findViewById(R.id.listView);

findViewById() 的输出没有强制转换:

System.out.println(findViewById(R.id.mainListView).getClass());     // class android.widget.ListView

System.out.println(findViewById(R.id.mainListView).getClass().getSimpleName());  // ListView

System.out.println((findViewById(R.id.mainListView) instanceof ListView));       // true

但确实 findViewById() 正在返回 ListView 对象,那么为什么需要强制转换 findViewById() 的返回?

【问题讨论】:

  • 您确定在这种特殊情况下需要它吗?来自文档:“注意:在大多数情况下——取决于编译器支持——结果视图会自动转换为目标类类型。如果目标类类型不受约束,则可能需要显式转换。” (该方法是通用的,类型参数将由您尝试分配的类型推断出来。)

标签: java android listview casting


【解决方案1】:

您需要转换 findViewById(int id) 的结果,因为您不是在转换 ListView 对象,而是在转换一个 View,其中 ListView 只是一个规范。

https://stackoverflow.com/a/19752066/2725502

【讨论】:

    【解决方案2】:

    作为一个观点,findViewById 函数返回一个视图而不是它的子视图,我认为你对返回值和从 getClass 获取的信息感到困惑。 findViewById(R.id.mainListView).getClass() 的输出是 ListView 因为视图里面还有它的子视图的信息,你可以通过方式获取。但实际上findViewById 返回一个 View 的值,所以你必须手动设置它。

    【讨论】:

      【解决方案3】:

      正如@Jon Skeet 在cmets 中提到的,findViewById(int id) 方法一般返回view(not subviews),但是这个方法是通用的,如果编译器知道目标类的类型可以返回子视图,所以在这种情况下, 强制转换是多余的,但如果目标类的类型不受限制,则必须显式转换。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多