2013-07-21 2 views
0

나는 간단한 취미 게임에 종사하고있는 컴퓨터 애호가입니다. 게임의 난이도를 높이기 위해 카운트 다운 타이머를 추가하고 있습니다.추상화 된 CountDownTimer 클래스가 활동에 링크 된 레이아웃보기 객체를 수정할 수 있습니까?

처음에는 GameActivity 파일에 새 카운트 다운 타이머를 정의하여 onTick 코드를 재정 의하여 각 틱마다 새로운 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

당신이 알아챈 것처럼 findViewById은 활동 외부에서 사용할 수 없습니다.

mContext.myTimerVisual.setImageResource(R.drawable.timerbar5); 

당신은이 경우 findViewById 할 필요가 없습니다, 또는 ImageView의 참조 (또는 다른 유지 : 당신은 당신의 onTick 방법 TrinityGameTimer

GameActivity mContext; 

public TrinityGameTimer(GameActivity context,long millisInFuture, long countDownInterval) { 
    super(millisInFuture, countDownInterval); 
    mContext = context 
    System.out.println("Timer has been started."); 
} 

의 생성자에서 GameActivity's 문맥을 통과해야 위젯).

+0

감사합니다. Vikram. 이것은 내 문제를 해결하고 컨텍스트에 액세스하는 방법을 더 잘 이해하게되었습니다. –

0

는 외부 클래스가 활동 레이아웃에 액세스하는 것이 가능하다 당연히, 당신은 당신의 타이머에 활동에 대한 참조를 통과 한 후 activity.findViewById(..)를 사용해야합니다.