2010-05-05 37 views
4

因此,我正在製作一個基本的國際象棋應用程序,以玩一些android編程的各種元素,到目前爲止我學到了很多,但這一次我迷了路。Android應用重新定位方向變化,處理的最佳方式是什麼?

當模擬器的方向改變時,活動被重置。根據我的研究,任何時候應用程序暫停/中斷都會發生同樣的事情,即。鍵盤改變,打電話,打回家鑰匙等。

顯然,國際象棋遊戲不斷重置是不可行的,所以我再次發現自己需要學習如何解決這個問題。

我的研究調出了一些主要的東西,覆蓋了我的Activity中的onPaused方法,使用Parcelables或序列化來偵聽方向,我的清單中的鍵盤更改(通過android:configChanges)。

我已經看過了使用Pacelables大量的示例代碼,但說實話這是太混亂了。也許明天用新鮮的眼睛回來會是有益的,但是現在我越看越可接受的東西,它的意義就越小。

我的應用程序利用一個板對象,它具有64個細胞對象(在一個8×8的二維數組),並且每個單元具有一塊對象,無論是實際的片或零如果空間是空的。假設我使用Parcelable或Serialization,我假設我必須Parcelize或Serialize每個類,Board,Cell和Piece。

首先,是Parcelable或序列號,甚至正確的事情在看這個問題?如果是這樣的話,首選Parcelable或Serializable?我是否正確地假設三個對象中的每一個都必須是Parceled/Serialized?最後,有沒有人有一個簡單易懂的Parcelable教程的鏈接?任何事情都能幫助我理解,並在應用程序進一步擴展時停止進一步的頭痛。

任何幫助,將不勝感激。

回答

3

Androids處理事件的默認方式是重新創建活動。基本上,你正確地處理一個進程,一切正常,不需要擔心手動處理這些事情。

Application Fundamentals具有活動生命週期的完整概述,但總而言之,您希望將活動狀態保存在onSaveInstanceState()方法中,並使用您在onCreate(Bundle savedInstanceState)中獲得的Bundle來恢復您的應用程序狀態。

如果你想你的類存放在包你最好的選擇是實現Parcelable接口。然後保存你的狀態,你做的事:

protected void onSaveInstanceState(Bundle outState) 
{ 
    super.onSaveInstanceState(outState); 
    outState.putParcelable("yourObject", mYourObject); 
} 

,並在onCreate方法你只需要做:

if (savedInstanceState != null) 
    mYourObject = savedInstanceState.getParcelable("yourObject"); 

當然,你可以只轉換你的對象爲普通陣列表示,該套件已經可以遏制和只是跳過實現Parcelable接口。基本上添加一個方法toArray()到你的對象和靜態方法fromArray()。那麼,遊玩一下,看看哪個更適合你。

1

覆蓋onRetainNonConfigurationInstance在你的Activity類。

在這種方法中,你必須返回一個對象,只是捆綁了你的遊戲的狀態在一個狀態對象,在這種方法中返回。確保這只是一個狀態對象,我的意思是它不應該包含在其中的活動,視圖等的句柄,否則你會得到內存泄漏。

在你onCreate方法調用getLastNonConfigurationInstance獲取對象回來。

您不必擔心android的實現細節(序列化)。

如果您還沒有確保你已經設置你的啓動模式在清單要麼singleTask或singleInstance這取決於適合您的需要更好。默認情況下,如果有人點擊回家,然後回到應用程序,它會啓動一個新的活動副本,如果沒有處理或配置爲單一實例,您將獲得運行遊戲活動的多個副本。

3

或者將這一行粘貼在OnCreate中,以便它不會滾動。問題解決了。

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
+2

爲什麼這是upvoted?這個人想通過保持他的申請狀態改變方向來解決問題。不要將他的應用限制爲肖像。這是忽略了一個問題,而不是解決問題! – 2014-04-08 10:05:28

8
在<活動>標記您的清單

,你可以添加機器人:configChanges =「方向| keyboardHidden」,這將重裝停止活動,並呼籲onConfigurationChanged(),而當方向改變或鍵盤被隱藏。

如果您需要進行調整時,這些事件的發生,你可以在你的活動覆蓋onConfigurationChanged(),如果不是所有你需要做的就是將屬性添加到清單。

喜歡的東西:

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    setContentView(R.layout.myLayout); 
} 

工作得很好。

1

當保存板狀態下,使一個int[64]和在每個位置存儲相應片。所以0 =空,1 =白色棋子,2 =白色騎士等...

當加載板狀態下,通過在陣列迭代,並創建適當的片在適當的位置的物體。

您可以將INT [64]轉換爲字符串在SharedPreferences存儲,或用Parcelable或任何使用它。只存儲您需要的最小數據。

相關問題