Java 更改活动会阻止ImageButton setImageResource工作
我有一个主要活动,每次单击时更改Java 更改活动会阻止ImageButton setImageResource工作,java,android,layout,android-activity,imagebutton,Java,Android,Layout,Android Activity,Imagebutton,我有一个主要活动,每次单击时更改ImageButton上的图像 public class MainActivity extends Activity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); static ImageButton mGet
ImageButton
上的图像
public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
static ImageButton mGetClickTime;
mGetClickTime.setOnClickListener(new View.OnClickListener() {
mUpdateBackground();
}
}
}
public static void mUpdateBackground() {
int[] imageIds = {
R.drawable.bg1,
R.drawable.bg2,
R.drawable.bg3,
R.drawable.bg4,
};
Random generator = new Random();
randomImageId = imageIds[generator.nextInt(imageIds.length)];
mGetClickTime.setImageResource(randomImageId);
}
这可以正常工作,直到单击菜单按钮并访问另一个活动为止
public class settings extends MainActivity{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.settings);
}
}
当按下菜单或后退按钮时,我们返回到主要活动。但是,一旦发生这种情况,ImageButton
不再会随着每次单击而更新图像。其他一切仍然有效,包括每次单击时更新的文本框
我做错了什么
编辑
谢谢你的帮助。目前,它似乎在我从子活动返回后继续工作。(万岁!)
但是现在,当从onResume()
或从其他活动调用mUpdateBackground
方法时,我无法使该方法工作。这就是我所处的位置:
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", "backgroundPicCALLED: "+randomImageId);
43 }
44 mGetClickTime = (ImageButton) findViewById(R.id.clicker);
45 mGetClickTime.setImageResource(randomImageId);
46 }
我的问题是,如果我取消注释第11行,我会得到一个
NullPointerException
。这可能是因为第27行的mUpdateBackground()
方法不是静态的
?如果我将其设置为静态
,那么在第44行,我在findViewById
上得到一个错误,无法从类型活动
对非静态
方法findViewById(int)
进行静态
引用。我真的被难住了。很明显,我没有正确地遵循逻辑,但我已经重复了几次,看不出它可能是什么。哈,现在我明白是什么困扰了你。您的问题是onResume或onCreate再次发生,这会将图像重置为您在XML中设置的默认值。您只需记录并查看发生了哪些情况。一旦看到图像返回到默认位置,只需在活动类中创建字段,该字段将记住当前图像id或所需内容。像这样的
private int currentImage = R.drawable.firstImage;
public class MainActivity extends Activity{
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
static ImageButton mGetClickTime;
mGetClickTime.setImageResource(currentImage);
mGetClickTime.setOnClickListener(new View.OnClickListener() {
mUpdateBackground();
}
}
}
public static void mUpdateBackground() {
int[] imageIds = {
R.drawable.bg1,
R.drawable.bg2,
R.drawable.bg3,
R.drawable.bg4,
};
Random generator = new Random();
randomImageId = imageIds[generator.nextInt(imageIds.length)];
mGetClickTime.setImageResource(randomImageId);
currentImage = randomImageId;
}
希望这对您有所帮助并享受您的工作。我从这个帖子中得到了答案: 关键在于学习在调用对象之前检查对象是否为空的概念 我使用的代码是:
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");
}
你试过把onClickListener放在简历上吗?如果它有效,除非你离开活动并再次回去,我认为这与生命周期问题有关。谢谢雷蒙德。我会试试的,但我不确定onResume是从哪里来的。好吧,我试过了,但没有用。我已经将onClickListener从onCreate方法中删除,并将其放在onResume方法中。应用程序仍然以与上面相同的方式工作和失败。所以我想这意味着一个生命周期问题-你知道我可以在哪里尝试了解这里发生了什么吗?另外,我一直在重构,我将文本框放在一个公共静态方法中,并将它们定义为公共静态变量,现在,它们的工作方式与ImageButton的工作方式不同。非常感谢您的帮助。当我试图将私有int currentimage行放在公共类MainActivity之外时,我在令牌上得到了错误语法错误。有可能把这条线放在活动之外吗?非常感谢你的建议。问题是,图像没有被重置回默认值,它只是无法更改。当这种情况发生时,最新的图像只会保留下来。