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

findViewById() 为对话框中的视图返回 null

Xamarin Adapter FindViewById返回null

findViewById 为现有的包含布局返回 null

findViewByID在FirestoreRecyclerAdapter中返回null