0

我是一个电脑爱好者,正在做一个简单的琐事游戏。为了增加游戏的难度,我添加了一个倒计时。

最初,我在我的 GameActivity 文件中定义了一个新的倒计时计时器,覆盖了 onTick 代码,因此它会在每次滴答时交换新的 ImageView 内容。只要玩家等待计时器结束,这一切都很好。但是,如果玩家在计时器结束之前猜到了答案,.cancel() 方法会导致整个应用程序崩溃。

为了解决这个问题,我创建了一个扩展 CountDownTimer 类的新类 (GameTimer.java)。然后,我从我的 GameActivity 文件中的适当位置调用此类的一个实例。当我的计时器的 ontick 方法只是使用 System.out.println 倒计时时,一切都会顺利进行。但是,当我尝试访问布局上的 ImageView 时,我可以看到 findViewById() 没有为此类定义(附加代码)。

一旦布局被某个活动膨胀,外部类是否可以访问/更改该布局上的项目?我知道 findViewById 是 android.app.Activity 类的一个方法,而我的倒数计时器只是扩展了 Java 对象。

我正在为我的倒数计时器附加代码,但我怀疑它没有多大帮助。我希望我的问题足够抽象,以至于我不需要发布我的 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.");


    }

}
4

2 回答 2

2

正如您所注意到的,findViewById不能在 Activity 之外使用。您应该在的构造函数中传递GameActivity'sContextTrinityGameTimer

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(或任何其他小部件)的引用。

于 2013-07-21T20:19:03.387 回答
0

当然,外部类也可以访问 Activity 布局,您只需在 Timer 中传递对 Activity 的引用,然后使用activity.findViewById(..).

于 2013-07-21T20:05:40.103 回答