2013-05-19 68 views
0

我有一個ImageButton,我希望每次調用onResume()onCreate()時都更改圖像。Android:這個應用程序的最佳層次結構是什麼?

我有改變圖像,稱爲mUpdateBackground的方法,但是我有麻煩工作如何結構中的分級,使得mUpdateBackground,(含有ImageButton)可從onResume()onCreate()被調用。

如果backgroundPic爲真,圖像將被隨機選擇,如果爲false,則將使用R.drawable.bg0代替。

有一個單獨的設置活動,用於管理backgroundPic變量設置爲true還是false。

這裏是我到目前爲止的代碼:

1 public class MainActivity extends Activity { 
2 public static ImageButton mGetClickTime; 
3 @Override 
4 protected void onResume() { 
5  super.onResume(); 
6  //Get shared preferences 
7    mSharedPreferences = getSharedPreferences(PREFERENCES_NAME, MODE_PRIVATE); 
8   dp = mSharedPreferences.getInt("DecimalPlaces", 0); 
9    length_setting = mSharedPreferences.getInt("MSSelector", 1); 
10    backgroundPic = mSharedPreferences.getBoolean("BackgroundPic", true); 
11    //mUpdateBackground(); 
12   } 
12 @Override 
13 protected void onCreate(Bundle savedInstanceState) { 
14  super.onCreate(savedInstanceState); 
15  setContentView(R.layout.activity_main); 
16 
17  //Get shared preferences 
18  mSharedPreferences = getSharedPreferences(PREFERENCES_NAME, MODE_PRIVATE); 
19  dp = mSharedPreferences.getInt("DecimalPlaces", 0); 
20  length_setting = mSharedPreferences.getInt("MSSelector", 5); 
21  mUpdateBackground(); 
22   mGetClickTime.setOnClickListener(new View.OnClickListener() { 
23  mUpdateBackground(); 
24   } 
25  } 
26 } 
27 public void mUpdateBackground() { 
28  if (backgroundPic) { 
29   int[] imageIds = { 
30     R.drawable.bg1, 
31     R.drawable.bg2, 
32     R.drawable.bg3, 
33     R.drawable.bg4, 
34 
35   }; 
36   Random generator = new Random(); 
37   randomImageId = imageIds[generator.nextInt(imageIds.length)]; 
38   Log.d("1", "backgroundPic: "+randomImageId); 
39  } 
40  else { 
41   randomImageId = R.drawable.bg0; 
42   Log.d("1", "backgroundPic: "+randomImageId); 
43  } 
44  mGetClickTime = (ImageButton) findViewById(R.id.clicker); 
45  mGetClickTime.setImageResource(randomImageId); 
46 } 

我有這樣做的問題是,如果我取消線11我得到一個NullPointerException異常。有沒有更好的方法來組織這些代碼?

+0

你mGetClickTime是靜態的!這是錯誤的,因爲它取決於活動。 mUpdateBackground方法中的哪一行是拋出NPE? –

+0

同樣在標準約定中,方法在開始時並沒有用m命名。m表示一個對象是一個成員變量,即它綁定到這個類的實例。 s是用於靜態的,所以如果你有一個靜態變量,它應該被命名爲sVariable。 –

回答

1

在使用它之前,你應該檢查你的代碼是否有空。在使用之前,您不檢查imageIds []是否爲空,並且還希望確保mGetClickTime是由findViewById分配的。在onresume似乎總是可能已經失去了記憶。我通常會檢查一切,看看我是否需要在恢復過程中重新初始化一個變量。我建議這是一種調試方式,並且更加強大。

+0

謝謝,我會嘗試。如何檢查mUpdateBackground方法是否爲空?或者你的意思是方法的內容,如mGetClickTime? –

+0

我指的是內容,即任何由於某種原因而爲空的變量。 – LanternMike

+0

我試圖做到這一點,但空行指針異常似乎在第11行調用該方法時發生。即使我將mUpdateBackground的全部內容註釋掉,仍會出現空指針異常。所以我想我應該推斷它是從內存中丟失的mUpdateBackground對象本身? –

1

這就是您的層次結構可能如下所示: in onCreate() bind do setContentView併爲按鈕指定OnClickListener。

只能在onResume()中完成onCreate()onResume()中應該完成的邏輯! onResume()總是在onCreate()之後調用,但在onResume()之前並不總是調用onCreate()。如果您的活動從後臺激活,則不會重新創建,但onResume()將被調用。

還有一件事是你的ImageButton變量是靜態的,它永遠不會是!這是特定於實例的字段,應該存儲在實例(成員)變量中。

另一件事(正如我在評論中提到的),你的方法不應該用mMethod約定命名。這是保留給成員變量。

+0

這是非常好的建議。謝謝你的幫助。 –

+0

其實,我注意到onResume是在onCreate之前列出的代碼。這可能導致了這個問題嗎?如果是這樣的話,這篇文章幫助我找到了答案和另一個答案。 –

+0

代碼中聲明/覆蓋方法的順序無關緊要。看看這篇關於Activity及其生命週期的文章,以瞭解它是如何工作的:) http://developer.android.com/reference/android/app/Activity.html –

0

我從這個線程的答案:Android: What's the best hierarchy for this app?

的關鍵是學習的檢查,如果一個對象是調用前空的概念。

我使用的代碼是這樣的:

if (mGetClickTime != null) { 
    Log.d("mGetClickTime: ", "is not null"); 
    mGetClickTime.setImageResource(randomImageId); 
} 
else { 
    mGetClickTime = (ImageButton) findViewById(R.id.clicker); 
    mGetClickTime.setImageResource(randomImageId); 
    Log.d("mUpdateBackground", " was null"); 
} 
相關問題