可以抽象出CountDownTimer类修改链接到活动的布局视图对象吗?

时间:2013-07-21 19:48:28

标签: android countdowntimer

我是一名正在制作简单琐事游戏的计算机爱好者。为了增加游戏的难度,我正在添加一个倒数计时器。

最初,我在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.");


    }

}

2 个答案:

答案 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(..)