findViewById 返回 null - Android - setContentView
Posted
技术标签:
【中文标题】findViewById 返回 null - Android - setContentView【英文标题】:findViewById returns null - Android - setContentView 【发布时间】:2012-04-23 23:09:34 【问题描述】:我在构建布局时遇到问题。我的情况是这样的:
我有一个Activity
,它可以运行并为普通和横向定义了一个布局,但它们是在运行时从onCreate()
构建的。
在onCreate()
中,我调用setContentView(my_normal_layout)
,然后将其添加到使用大量addView()
等并且工作正常。然而,我也在尝试构建我的横向布局,但是当我尝试使用findViewById()
来获取我的基本布局时,它是存储在res/layout-land
中的布局文件的一部分,它返回null
。
现在我已经查看了针对有 null 返回问题的人的解决方案,但人们建议必须首先执行 setContentView
。但是我不想将内容视图设置为我的横向布局,我只希望在屏幕旋转时发生这种情况(它会自动执行此操作吗?)。
那么有谁知道我如何解决使用findViewById
并更改未设置为内容视图的视图的问题?
我可以发布任何需要的代码行,但我希望解释足够好。 谢谢,
乔什
【问题讨论】:
看到这个:***.com/a/4858040/1010868 还有这个:developer.android.com/guide/practices/… :) 我已经明白这一点,但它不能解决我的问题,因为我需要一个单独的布局。 将纵向布局放入/res/layout/my_layout.xml
并将横向放入/res/layout-land/my_layout.xml
可以是完全不同的文件-如果其中一个缺少某些viewid,那么您只需从findViewById 中获取null,您就可以充分.
【参考方案1】:
如果我理解正确,您在两个不同的布局文件中有不同的 UI 元素。
如果是这种情况,那么您仍然可以将布局文件命名为相同(/res/layout
中的一个,/res/layout-land
中的一个)并使用 setContentView(...)
自动扩展正确的文件。
之后,您只需要知道当前方向是什么(纵向或横向),就可以知道使用findViewById(...)
调用哪些代码。
您可以使用...找到方向
getWindowManager().getDefaultDisplay().getOrientation();
如果您使用的是 API 8 (Android v2.2) 或更高版本,则上述内容已被弃用,您应调用 getRotation()
而不是 getOrientation()
。
见Display.getOrientation()
【讨论】:
理想情况下,您的两个布局文件(尽管完全不同的视图元素仍将具有所有相同的视图元素,因此 null findViewById() 不是问题,但这是迄今为止最好的方法 @JRaymond:同意。通常的情况是简单地重新排列相同的 UI 元素以充分利用方向并使用相同的资源 ID。根据 OP 的应用程序,可能有正当理由向横向布局添加额外元素,尽管这不是我需要做的事情。 为帮助喝彩,我使用了获取方向的方法来设置我正确的上下文视图。也感谢@JRaymond 的额外建议。我对 android 开发很陌生,所以我还在尝试不同的东西。我有 2 种布局的原因是,当手机是纵向时,我将时间表显示为条目列表,但在横向时,我会显示时间表的网格。我几乎可以满足我的要求,但我可以很高兴地承认它有点混乱,毫无疑问有更好的方法来做事。反复试验。再次欢呼。 @JoshSuckling:很高兴为您提供帮助。现在你已经解释过了,我可以在列表和网格视图中看到逻辑。以上是关于findViewById 返回 null - Android - setContentView的主要内容,如果未能解决你的问题,请参考以下文章
findViewById 返回 null (TextView) [重复]
findViewById() 为对话框中的视图返回 null