5

我需要對我的活動的縱向和橫向方向應用不同的佈局。此外,如果方向是縱向,我需要顯示警報。在Android中旋轉的處理活動

我在AndroidManifest中指定了android:configChanges="orientation|keyboardHidden"。我還覆蓋onConfigurationChanged方法是這樣的:

@Override 
public void onConfigurationChanged(Configuration newConfig) 
{ 
    Log.d("tag", "config changed"); 
    super.onConfigurationChanged(newConfig); 

    int orientation = newConfig.orientation; 
    if (orientation == Configuration.ORIENTATION_PORTRAIT) 
     Log.d("tag", "Portrait"); 
    else if (orientation == Configuration.ORIENTATION_LANDSCAPE) 
     Log.d("tag", "Landscape"); 
    else 
     Log.w("tag", "other: " + orientation); 

    .... 
} 

雖然從橫向旋轉爲縱向日誌是這樣的:

config changed 
Portrait 

不過,雖然從縱向改爲橫向,它看起來像

config changed 
Portrait 
config changed 
Landscape 

爲什麼onConfigurationChanged被調用兩次?我怎樣才能避免它?

回答

3

見我回答另一個問題在這裏:https://stackoverflow.com/a/3252547/338479

總之,處理配置的變化正確地很難做到。最好實施onRetainNonConfigurationInstance(),在您的應用程序即將由於配置更改而停止並重新啓動之前調用它。使用這種方法保存任何你想要的('this'是一個不錯的選擇),然後讓系統拆除你的應用程序。

當您的應用程序重新啓動時使用新的配置,使用getLastNonConfigurationInstance()來檢索您剛剛保存的狀態,並使用它來繼續您的應用程序,而沒有與捆綁包和共享首選項混在一起。

0

是否有任何特殊的原因,您選擇以這種方式處理旋轉?雖然它更快,因爲活動不會在方向更改時重新啓動,但如果我記得正確,通常不推薦使用它。處理方向變化的另一種方式是不是壓倒一切的,覆蓋onCreate()onStart()onResume()這樣

@Override 
public void onStart() { 
    super.onStart(); 
    int orientation = getWindowManager().getDefaultDisplay().getOrientation(); 
    if(orientation == Configuration.ORIENTATION_PORTRAIT) { 
     Log.i(TAG, "Orientation is portrait"); 
     // show whatever alerts here 
    } 
} 

,然後指定兩個佈局 - 一個肖像,一個景觀。版式的肖像版本將保持在res/layout/whatever.xml,而風景版本將保存在res/layout-land/whatever.xml中。 AndroidGuys已經寫了一堆關於這個主題的好文章,參見http://androidguys.com/?s=rotational+forces&x=9&y=9

+0

爲什麼onConfigurationChanged()方法不好?你能給我一個解釋鏈接嗎? 如果我將使用onCreate()或類似的東西,活動將被重新創建,其數據將會丟失。 – darja 2010-09-26 04:32:26

0

我敢肯定你會想用onCreate而不是onStart。唯一的區別似乎是onStart在應用程序到達前臺時會被調用。如果您希望讓用戶等待您重新初始化用戶界面,那就不是這種情況。否則,只要根據條件改變你的setContentView調用。

+0

我同意你的說法,當設備的方向發生變化時,onCreate方法被調用 – 2010-09-26 11:44:51

+0

爲什麼onConfigurationChanged更好? – darja 2010-09-26 14:11:44

+0

我相信在這種情況下你最終會構建你的UI兩次。當屏幕旋轉時,onConfigurationChange和onCreate都會被調用。您已經必須在onCreate中爲所有其他創建情況設置UI。 – JOTN 2010-09-26 18:05:28

0

當改變方向時,Android會啓動一個新的活動實例,所以使用onCreate是理想的方法。您必須明顯地保存/恢復您的活動數據,以便從中斷的地方獲取 - 但無論如何,您應該這樣做,因爲任何數量的事件都可能會導致您的應用程序無法集中/中斷。

+0

爲什麼downvotes?他是對的。 – 2013-01-25 16:12:58

1

您可以簡單地保存以前的方向,並檢查它是否真的改變。

如果您設置爲AndroidManifest.xmlandroid:configChangeskeyboardHidden|orientation爲您的活動,onCreate etc ...將不會被調用。這使得實現更容易實現。但是,當然佈局也會從肖像變爲風景。