2011-06-23 95 views
36

我在告訴Android在方向更改時不要調用onCreate()時遇到問題。我已將android:configChanges="orientation"添加到我的清單中,但仍在調用方向更改onCreate()時調用。這是我的代碼。Android onConfigurationChanged未被調用

AndroidManifest.xml中

<activity android:name="SearchMenuActivity" android:theme="@android:style/Theme.NoTitleBar" android:configChanges="orientation"></activity> 

SearchMenuActivity.java

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    // Set the current layout to the search_menu 
    setContentView(R.layout.search_menu_activity); 

    Log.d(TAG, "onCreate() Called"); 
} 
@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    //don't reload the current page when the orientation is changed 
    Log.d(TAG, "onConfigurationChanged() Called"); 
    super.onConfigurationChanged(newConfig); 
} 

而且我logcat的輸出

06-23 12:33:20.327: DEBUG/APP(2905): onCreate() Called 
//Orientation Changes 
06-23 12:33:23.842: DEBUG/APP(2905): onCreate() Called 

有誰知道我做錯了嗎?謝謝。

回答

51

幾件事情嘗試:

android:configChanges="orientation|keyboardHidden|screenSize"而不是android:configChanges="orientation"

確保你是不是叫setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);任何地方。這會導致onConfigurationChange()不會觸發。

檢查您是否在清單中使用了android:screenOrientation

如果這些都不起作用,請仔細閱讀Android文檔,瞭解如何處理運行時更改並確保您正確地執行了所有操作。您的代碼中可能存在其他問題導致問題。 http://developer.android.com/guide/topics/resources/runtime-changes.html

編輯:正如derrik指出的,我認爲你正在改變配置,加速度計檢測設備面對的方式。如果您希望在顯示/隱藏鍵盤時更改配置,清單中的configChanges也必須包含keyboardHidden

+6

對我來說,訣竅是使用 android:configChanges =「orientation | keyboardHidden | screenSize」 –

5

你應該改變在AndroidManifest.xml到configChanges項:

android:configChanges="keyboardHidden|orientation" 

否則,滑動鍵盤不會觸發onConfigurationChange(),即使取向的變化。我只是測試這對我的HTC Desire Z.

+0

在我的情況下,只有當我添加「| screenSize」時才起作用。 –

+0

這個答案不再有效,由於sdk – Entreco

78

這是我對〜同樣的問題精怪:

注意:從Android 3.2開始(API等級13), 「屏幕尺寸」 也改變當設備在縱向和橫向 方向之間切換時。因此,如果要在開發API級別13或更高級別(由minSdkVersion和targetSdkVersion屬性聲明的 )時爲 方向更改而阻止運行時重新啓動,則 除「方向」外還必須包含「screenSize」值爲 。也就是說,你必須decalare android:configChanges =「orientation | screenSize」。但是,如果您的 應用程序的目標級別爲12或更低,則您的活動始終會自行處理此配置更改(即使在更高版本的Android 3.2或更高版本的設備上運行此配置更改 也不會重新啓動您的活動)。

(從http://developer.android.com/guide/topics/resources/runtime-changes.html

TL; DR:添加 「|屏幕尺寸」 到Android:configChanges = 「方向」 爲API 14+

+7

+1的變化,你是男人! – lorenzoff

+2

真棒......將targetSdkVersion從8改爲14後,我想知道爲什麼onConfigurationChanged()沒有被調用。 – dell116

+0

Thanx ..幫了我很多.. – Rekha

10

嘗試使用這一個.....

android:configChanges="orientation|keyboardHidden|screenSize" 
4

將此添加到您的清單中以進行每項活動。

android:configChanges="keyboardHidden|orientation|screenSize" 

然後,在你的活動覆蓋onConfigurationChanged這樣

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
} 
1

這不是在觸發我FragmentFragments未在AndroidManifest.xml註冊的),所以我不得不將它移動到Activity管理我的Fragment,在我的情況下是TabsPagerActivity

1

清單:

<activity 
     android:name=".MainActivity" 
     android:configChanges="orientation|keyboardHidden|screenSize"> 
</activity> 

活動&片段:

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    Log.d(TAG, "onConfigurationChanged " + 
       (newConfig.orientation 
       == Configuration.ORIENTATION_LANDSCAPE 
       ? "landscape" : "portrait")); 
} 

輸出:

10-29 21:53:26.951 D/FragmentOne: onConfigurationChanged landscape 

10-29 21:53:26.951 D/MainActivity:onConfigurationChanged landscape 
1
很少

東西都可以相互覈對:

在我的情況下,我正在使用onConfigurationChanged跟蹤設備的語言更改。

關於onConfigurationChanged的一些事情需要知道Activity和Application的onConfigurationChanged之間的行爲有一些區別。

當您更改設備的配置時,應用程序級別onConfigurationChanged將自動立即調用,但當您導航到該活動時,onConfigurationChanged將立即調用activity。

和另一件事是所以你必須用語言環境(對我來說)這應該是像機器人沿着申報其他配置更改事件只在明顯的區域不會有時工作:configChanges =「的layoutDirection |區域」

相關問題