2014-03-24 163 views
0

我正在嘗試處理屏幕方向更改爲我的Android應用程序,但沒有成功。 這裏是我的清單:如何處理屏幕方向更改

<activity 
     android:name="fr.ups.l3info.l3info_catchgameactivity.CatchGameActivity" 
     android:label="@string/app_name" 
     android:screenOrientation="user" 
     android:configChanges="orientation|keyboardHidden" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

和我在活動課阿迪這樣的功能:

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

但是,當我改變屏幕方向的應用程序,並重新永遠不會執行此功能。我做錯了什麼?謝謝你的幫助。

+0

我想改變方向始終重新創建activty – Rob

+0

你怎麼知道這個函數沒有被調用? –

+0

我打了我的代碼 – Hunsu

回答

2

使用此在您的清單 android:configChanges="keyboardHidden|orientation|screenSize|layoutDirection"

+0

這是最後一個資源解決方案,應儘可能避免 – nKn

+0

它的工作。但所有的教程,我讀只是說增加android:configChanges =「orientation | keyboardHidden」 – Hunsu

+0

該文件說'如果您的應用程序的目標API級別13或更高(由minSdkVersion和targetSdkVersion屬性聲明),那麼你也應該聲明「screenSize」配置,因爲當設備在縱向和橫向之間切換時,它也會發生變化。 –

0

如果你想定義一個「不同的佈局」到你的應用程序時,方位的變化,只是定義了一個新的佈局給它同名作爲您其他佈局並將其置於res/layout-land之下。

所以,當你的應用程序本身重現,並呼籲setContentView(layout_name)onCreate函數內就會調用res/layout-land而不是res/layout下一個下。

2

您可能想了解更多關於活動生命週期的信息。更多你可以在這裏找到(http://developer.android.com/training/basics/activity-lifecycle/index.html

但更重要的是要熟悉你的活動狀態

您正在查找的方法不是onConfigurationChanged(Configuration newConfig),而是onSaveInstanceState(Bundle savedInstanceState)

現在在您的OnCreate()方法中,您需要檢查是否存在已保存的狀態,然後重新創建該狀態。

有這個環節上很好的解釋:Saving Android Activity state using Save Instance State

但基本上你需要做的是這樣的:

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    // Save the user's current game state 
    savedInstanceState.putInt(STATE_SCORE, mCurrentScore); 
    savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel); 

    // Always call the superclass so it can save the view hierarchy state 
    super.onSaveInstanceState(savedInstanceState); 
} 

,然後考慮到這一點:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); // Always call the superclass first 

    // Check whether we're recreating a previously destroyed instance 
    if (savedInstanceState != null) { 
     // Restore value of members from saved state 
     mCurrentScore = savedInstanceState.getInt(STATE_SCORE); 
     mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL); 
    } else { 
     // Probably initialize members with default values for a new instance 
    } 
    ... 
} 

STATE_SCORESTATE_LEVEL是一些public static final String值用於以某種方式標籤你想要保存的東西。

例如,如果您有EditText視圖,並且輸入了某些內容,然後旋轉屏幕,則該值將丟失。但是在你的onSaveInstanceState()方法中,你應該使用Bundle參數,並把你的EditText視圖的值作爲一個String。

通過保存,現在您可以在onCreate()方法中獲取該值,並將EditText視圖的值設置爲該值。

希望這有助於:)

+0

是的,我已經閱讀過。我遇到的問題是我無法保存對象(我可以很難實現)。 – Hunsu

+0

你真的需要屏幕旋轉。如果不是,您可以通過在清單中添加旋轉屬性來鎖定旋轉。 但是如果你需要輪換,還有一個技巧。讓我知道你需要什麼。 –

+0

是的,我需要屏幕旋轉 – Hunsu