更改活动会阻止ImageButton setImageResource工作

我有一个主要活动,每次点击都会改变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()方法不是static ? 如果我将它设置为static那么在第44行,我在findViewById出现错误,无法从类型Activitynon-static方法findViewById(int)进行static引用。 我真的很难过。 我显然没有正确地遵循逻辑,但我已经过了几次,我看不出它可能是什么。

哈,现在我看到困扰你的是什么。 您的问题是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; } 

希望这有助于并享受您的工作。

我从这个post得到了答案: 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"); }