2012-04-23 101 views
4

我在构建布局时遇到了问题。我的情况是这样的:findViewById返回null - Android - setContentView

我有一个运行,并具有正常和景观定义的布局,但它们都建在运行时从onCreate()Activity

onCreate()我打这个电话给setContentView(my_normal_layout),然后将其添加到使用了大量的addView()的等,并能正常工作。不过,我也尝试构建自己的横向布局,但遇到问题,当我尝试使用findViewById()获取作为我的布局文件一部分存储在res/layout-land中的基础布局时,它将返回null

现在我已经研究过有空返回问题的人的解决方案,但人们建议必须先执行setContentView。但是我不想将内容视图设置为我的横向布局,我只希望在屏幕旋转时发生这种情况(它会自动执行此操作?)。

那么有谁知道我可以解决这个问题,使用findViewById并改变我的视图没有设置为内容视图?

我可以发布任何需要的代码行,但我希望这个解释足够好。 谢谢,

乔希

+0

看到这一点:http://stackoverflow.com/a/4858040/1010868 – 2012-04-23 23:19:13

+0

这:http://developer.android.com/guide/practices/screens_support.html#qualifiers :) – 2012-04-23 23:20:43

+0

我已经了解这一点,但它无法解决我的问题,因为我需要一个单独的布局。 – 2012-04-23 23:23:28

回答

3

如果我理解正确的,你必须在两个不同的布局文件不同的UI元素。

如果是这种情况,那么您仍然可以命名布局文件相同(/res/layout中的一个和/res/layout-land中的一个),并使用setContentView(...)来自动填充正确的布局文件。

之后,您需要知道的是当前方向(纵向或横向),以便知道使用findViewById(...)调用哪些代码位。然而

您可以使用方向...

getWindowManager().getDefaultDisplay().getOrientation(); 

如果您使用的API 8(安卓V2.2)或更高版本,上面已被废弃,你应该叫getRotation()而不是getOrientation()

Display.getOrientation()

+0

理想情况下,你的两个布局文件(虽然完全不同)仍然具有所有相同的视图元素,所以null findViewById()不是问题,但这是迄今为止最好的方法 – JRaymond 2012-04-23 23:35:58

+0

@JRaymond:同意。情况就是简单地重新排列相同的用户界面元素,以充分利用方向并使用相同的资源ID。根据OP的应用程序,向景观布局添加额外元素可能是合法的原因,尽管这不是我'我们需要去做。 – Squonk 2012-04-23 23:45:43

+0

干杯的帮助,我使用获取方向来设置我的正确的上下文视图的方法。感谢@JRaymond的额外建议。我很新的Android开发,所以即时通讯仍然尝试不同的事情。之所以我有2个布局是因为当手机是肖像即时表显示时间表作为条目列表,然后在横向即时显示时间表的网格。我几乎可以根据需要使其功能齐全,但我可以高兴地承认它有点混乱,毫无疑问有更好的方法来做事。试错。再次欢呼。 – 2012-04-24 00:07:00