【问题标题】:Changing activities prevents ImageButton setImageResource from working更改活动会阻止 ImageButton setImageResource 工作
【发布时间】:2013-05-17 20:43:17
【问题描述】:

我有一个主要活动,每次点击都会更改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 上得到一个错误,无法从Activity 类型中对non-static 方法findViewById(int) 进行static 引用。我真的很难过。我显然没有正确地遵循逻辑,但我已经重复了几次,但我看不出它可能是什么。

【问题讨论】:

  • 您是否尝试过将 onClickListener 放入 onResume 中?如果它有效,除非您离开活动并再次返回,我认为它与生命周期问题有关。
  • 谢谢雷蒙德。我会尝试,但我不确定 onResume 被调用的位置。
  • 好的,我试过了,但它不起作用。我已将 onClickListener 从 onCreate 方法中删除,并将其放入 onResume 方法中。该应用程序仍然可以运行,也可以以与上述相同的方式失败。
  • 所以我猜这意味着一个生命周期问题 - 你知道我可以在哪里尝试了解这里发生的事情吗?
  • 另外,我一直在重构,我将文本框放在公共静态方法中并将它们定义为公共静态变量,现在它们的工作方式与 ImageButton 完全不同不工作。

标签: java android layout android-activity imagebutton


【解决方案1】:

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

希望这对您有所帮助并享受您的工作。

【讨论】:

  • 非常感谢您的帮助。当我尝试将私有 int currentimage 行放在公共类 MainActivity 之外时,我收到错误语法错误标记。是否可以将这条线放在 Activity 之外?
  • 非常感谢您的建议。问题是,图像没有被重置回默认值,它只是无法更改。发生这种情况时,只会保留最新的图像。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多