2012-04-23 105 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