0

我有一个ImageButton并且我希望它的形象在每次被调用onResume()时都会改变。onCreate()

我有一个更改图像的方法,称为mUpdateBackground,但我无法确定如何构造层次结构,以便可以从和调用mUpdateBackground, (包含) 。ImageButtononResume()onCreate()

如果backgroundPic为真,则随机选择图像,如果为假,则R.drawable.bg0使用图像代替。

有一个单独的设置活动来管理backgroundPic变量是设置为真还是假。

到目前为止,这是我的代码:

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。有没有更好的方法来组织这段代码?

4

3 回答 3

1

您应该在使用之前检查您的代码是否有任何内容为空。您在使用前不检查 imageIds[] 是否为空,而且(已经有一段时间了)您想确保 mGetClickTime 由 findViewById 分配了一些东西。在 onresume 中,似乎总是有可能内存不足。当我过去完成 android 时,我通常会检查所有内容以查看是否需要在简历中重新初始化变量。我建议这是一种调试和更健壮的方法。

于 2013-05-19T12:44:54.007 回答
1

这就是您的层次结构的样子:在onCreate()绑定中执行 setContentView 并使用 OnClickListener 分配按钮。

应该在bothonCreate()和in中完成的逻辑onResume()可以在onResume()only中完成!onResume()总是在 之后调用,onCreate()onCreate()并不总是在 之前调用onResume()。如果您的活动被从后台激活,它将不会被重新创建,但onResume()会被调用。

另一件事是您的 ImageButton 变量是静态的,它不应该是静态的!这是特定于实例的字段,应存储在实例(成员)变量中。

另一件事(正如我在评论中提到的)是您的方法不应使用 mMethod 约定命名。这是为成员变量保留的。

于 2013-05-19T13:16:39.590 回答
0

我从这个线程得到了答案:Android:这个应用程序的最佳层次结构是什么?

关键是学习在调用对象之前检查对象是否为空的概念。

我使用的代码是这样的:

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");
}
于 2013-05-19T21:30:48.143 回答