0

フレーム レイアウトの背景画像を 1 秒ごとに変更したいと考えています。このタスクでは、timer および timertask クラスを使用しますが、最初の背景が変更されず、次のコードをテストする物理デバイスが異常終了するため、機能していないようです。

    FrameLayout fl;
List<Integer> myList;
int i = 0;
TimerTask myTimerTask = new TimerTask()
{
    public void run()
    {
        fl.setBackgroundResource(myList.get(i));
        i++;
    }
};


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    myList = new ArrayList<Integer>();
    myList.add(R.drawable.square1);
    myList.add(R.drawable.square2);
    myList.add(R.drawable.square3);
    myList.add(R.drawable.square4);
    myList.add(R.drawable.square5);
    myList.add(R.drawable.square6);
    myList.add(R.drawable.square7);
    myList.add(R.drawable.square8);
    myList.add(R.drawable.square9);
    myList.add(R.drawable.square10);
    myList.add(R.drawable.square11);
    myList.add(R.drawable.square12);



    fl = (FrameLayout)findViewById(R.id.frameLayout1);

    long delay = 1000;
    long period = 1000;

    Timer t = new Timer();
    t.schedule(myTimerTask,delay,period);


}

どこで失敗しますか? ^^ お忙しい中、ありがとうございました。

4

3 に答える 3

0

タイマーなどの非 UI スレッドからビューにアクセスすることはできません。ビューを更新し、メッセージを送信するタイマーを取得するには、ハンドラーが必要です。そして、次のように i が範囲外にならないようにする必要があります。

TimerTask myTimerTask = new TimerTask() {
    public void run() {
        Message m = Message.obtain();
        m.what = i;
        myUpdateHandler.sendMessage(m);
        i++;
        if (i >= myList.size())
            i = 0;
    }
};

.

Handler myUpdateHandler = new Handler() {
    /** Gets called on every message that is received */
    @Override
    public void handleMessage(Message msg) {
        fl.setBackgroundResource(myList.get(msg.what));

    }
};

.

于 2011-08-22T14:56:08.740 に答える
0

invalidate()新しいバックグラウンド リソースを設定した後に呼び出す必要があります。

于 2011-08-22T14:43:33.940 に答える
-1

さて、あなたはあなたのコードにいくつかの問題を抱えています。あなたのコードから、「fi」がどこで初期化されるかは明確ではありません、それはタイマーコールバックが呼び出される前ですか?後?int "i"の目的は何ですか?クラスのメンバーではないですか?アクティビティのonDestroyでタイマーを停止する必要があります。そうしないと、フレームレイアウトにアクセスするときに望ましくない動作が発生する可能性があります。

とにかく、onCreateから次を実行してみてください。

final FrameLayout fl = (FrameLayout)findViewById(R.id.frameLayout1); // You must have final here
final List<Integer> myList = <get it from where you need to>
int i = 0; // What is the purpose of this int? it passed by value to the callback - are you sure it is needed?
TimerTask myTimerTask = new TimerTask()
{
    public void run()
    {
        fl.setBackgroundResource(myList.get(i));
        i++; // Shouldn't it be a class member?
    }
};
于 2011-08-22T13:39:42.337 に答える