我有一个ImageButton
,我希望每次调用onResume()
或onCreate()
时都会更改其图片。
我有一个更改图像的方法,名为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 :(得分:1)
在使用之前,您应该检查代码是否为null。在使用之前你没有检查imageIds []是否为null,而且(它已经有一段时间了)你要确保通过findViewById为mGetClickTime分配了一些内容。在onresume上,似乎总有可能内存已经耗尽。我通常检查所有内容,看看我是否需要在恢复时重新初始化变量,当我在过去完成android时。我建议将其作为一种调试方式,并使其更加健壮。
答案 1 :(得分:1)
这是您的层次结构的样子:
在onCreate()
bind中执行setContentView并使用OnClickListener分配按钮。
onCreate()
和onResume()
中应该完成的逻辑只能在onResume()
中完成!始终在onResume()
之后调用onCreate()
,但onCreate()
之前并不总是调用onResume()
。如果您的活动从后台激活,则不会重新创建,但会调用onResume()
。
还有一件事是你的ImageButton变量是静态的,它永远不应该是!这是特定于实例的字段,应存储在实例(成员)变量中。
另一件事(正如我在评论中提到的)是你的方法不应该用mMethod约定命名。这是为成员变量保留的。
答案 2 :(得分: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");
}