簡體   English   中英

Android:這個應用程序的最佳層次結構是什么?

[英]Android: What's the best hierarchy for this app?

我有一個ImageButton ,我希望每次調用onResume()onCreate()時它的圖像都會改變。

我有一個更改圖像的方法,稱為mUpdateBackground ,但我mUpdateBackground如何構造層次結構,以便可以從onResume()onCreate()調用mUpdateBackground (包含ImageButton onCreate()

如果backgroundPic為true,則將隨機選擇圖像,如果為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 有沒有更好的方法來組織這段代碼?

在使用之前,您應該檢查代碼是否為null。 在使用之前你沒有檢查imageIds []是否為null,而且(它已經有一段時間了)你要確保通過findViewById為mGetClickTime分配了一些內容。 在onresume上,似乎總有可能內存已經耗盡。 我通常檢查所有內容,看看我是否需要在恢復時重新初始化變量,當我在過去完成android時。 我建議這是一種調試和更強大的方法。

這就是層次結構的樣子:在onCreate()執行setContentView並使用OnClickListener分配按鈕。

應該在這兩個做邏輯onCreate()onResume()可以在做onResume()只! onResume()總是在onCreate()之后調用,但onCreate()並不總是在onResume()之前調用。 如果您的活動從后台激活,則不會重新創建,但會調用onResume()

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

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

我從這個帖子得到了答案: Android:這個應用程序的最佳層次結構是什么?

關鍵是在調用之前學習檢查對象是否為null的概念。

我使用的代碼是這樣的:

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");
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM