我是一名正在制作简单琐事游戏的计算机爱好者。为了增加游戏的难度,我正在添加一个倒数计时器。
最初,我在GameActivity文件中定义了一个新的倒数计时器,覆盖了onTick代码,因此它会在每个tick中交换新的ImageView内容。只要玩家等待计时器完成,这就可以正常工作。但是,如果播放器在计时器完成之前猜到答案,则.cancel()方法会导致整个应用程序崩溃。
为了解决这个问题,我创建了一个扩展CountDownTimer类的新类(GameTimer.java)。然后,我从GameActivity文件中的相应位置调用此类的实例。当我的计时器的ontick方法简单地用System.out.println倒计时时,一切都在游泳。但是,当我尝试访问布局上的ImageView时,我可以看到没有为此类定义findViewById()(附加代码)。
一旦布局被特定活动夸大,外部类是否可以访问/更改该布局上的项目?我知道findViewById是android.app.Activity类的一个方法,而我的倒计时器只是扩展Java Object。
我正在为我的倒数计时器附加代码,但我怀疑它没有多大帮助。我希望我的问题足够抽象,我不需要发布我的gameActivity代码。如果该代码有帮助,我会在发布之前尝试清理它。
package edu.trinity.madvertising;
import android.os.CountDownTimer;
import android.widget.ImageView;
public class TrinityGameTimer extends CountDownTimer {
private ImageView myTimerVisual;
public TrinityGameTimer(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
System.out.println("Timer has been started.");
}
@Override
public void onFinish() {
System.out.println("Timer has been stopped.");
}
@Override
public void onTick(long arg0) {
// The problem is here. I cannot findViewById
ImageView myTimerVisual = (ImageView)findViewById(R.id.imageview_game_timer);
myTimerVisual.setImageResource(R.drawable.timerbar5);
System.out.println("Tick. Tick.");
}
}
答案 0 :(得分:2)
正如您所注意到的,findViewById
不能在活动之外使用。您应该在GameActivity's
TrinityGameTimer
Context
GameActivity mContext;
public TrinityGameTimer(GameActivity context,long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
mContext = context
System.out.println("Timer has been started.");
}
在onTick
方法中:
mContext.myTimerVisual.setImageResource(R.drawable.timerbar5);
在这种情况下,您不需要findViewById
,或保留ImageView
(或任何其他小部件)的引用。
答案 1 :(得分:0)
当然外部类可以访问Activity布局,您只需要在Timer中传递对Activity的引用,然后使用activity.findViewById(..)
。