1

次のように作成された ButtonList というボタンの配列があります。

LinearLayout player=(LinearLayout)findViewById(R.id.playerlayout);
        PlayerFirst=(Button)player.getChildAt(0);
        for(int i=0;i<player.getChildCount();i++)
        {
            ButtonList.add((Button)player.getChildAt(i));
        }

これらのボタンの値を順次インクリメントする必要があります (各変更の間に遅延があります)。次のコードがあります。

for( k=0;k<ButtonList.size();k++)           
{
    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
        public void run() {  
            ButtonList.get(getK()).setText(getK()+1+"");
        }
    }, 1000); 
}

ここで getK() は、無名関数内の k にアクセスするための k のアクセサーです。

public int k;
public int getK()
{
    return k;
}

アプリケーションがクラッシュします。私は何を間違っていますか?

LogCat エラー:

01-03 05:21:04.396: I/Process(1469): Sending signal. PID: 1469 SIG: 9
01-03 05:21:06.276: E/Trace(1535): error opening trace file: No such file or directory (2)
01-03 05:21:08.826: W/dalvikvm(1535): threadid=1: thread exiting with uncaught exception (group=0x2bd39930)
01-03 05:21:08.846: E/AndroidRuntime(1535): FATAL EXCEPTION: main
01-03 05:21:08.846: E/AndroidRuntime(1535): java.lang.IndexOutOfBoundsException: Invalid index 12, size is 12
01-03 05:21:08.846: E/AndroidRuntime(1535):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
01-03 05:21:08.846: E/AndroidRuntime(1535):     at java.util.ArrayList.get(ArrayList.java:304)
01-03 05:21:08.846: E/AndroidRuntime(1535):     at com.example.awari.MainActivity$1.run(MainActivity.java:129)
01-03 05:21:08.846: E/AndroidRuntime(1535):     at android.os.Handler.handleCallback(Handler.java:725)
01-03 05:21:08.846: E/AndroidRuntime(1535):     at android.os.Handler.dispatchMessage(Handler.java:92)
01-03 05:21:08.846: E/AndroidRuntime(1535):     at android.os.Looper.loop(Looper.java:137)
01-03 05:21:08.846: E/AndroidRuntime(1535):     at android.app.ActivityThread.main(ActivityThread.java:5039)
01-03 05:21:08.846: E/AndroidRuntime(1535):     at java.lang.reflect.Method.invokeNative(Native Method)
01-03 05:21:08.846: E/AndroidRuntime(1535):     at java.lang.reflect.Method.invoke(Method.java:511)
01-03 05:21:08.846: E/AndroidRuntime(1535):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-03 05:21:08.846: E/AndroidRuntime(1535):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-03 05:21:08.846: E/AndroidRuntime(1535):     at dalvik.system.NativeStart.main(Native Method)
4

3 に答える 3

1

あなたのエラーは'get(getK())' によるものです。次のアクセサーを見つけているとき、何をしているのかわかりません。この条件を FOR ループの中に入れてください。

ハンドラーに問題はありません。

*if(getK() <= ButtonList.size()) {
     ButtonList.get(getK()).setText(" "+(getK()+1)); 
}*
于 2013-01-03T15:56:09.233 に答える
0

ButtonList.size()1000ミリ秒の遅延で時間を実行するように指示しているため、1000ミリ秒間隔で発生していません。0 ミリ秒で開始し、各ループ反復間の計算時間を 1 ミリ秒と仮定すると、更新は 1000 ミリ秒、1001 ミリ秒、1002 ミリ秒などで発生しますTimerTask。固定遅延で を使用する方がよいでしょう。

于 2013-01-03T05:11:48.333 に答える
0

ButtonList というボタンの配列があります。これらのボタンの値を順次インクリメントする必要があります (各変更の間に遅延があります)。

必要なことを行うには、1 つの Handler と Runnable だけが必要です。コードを少し整理してみましょう。

まずhandler、フィールド変数を作成します。次に、ButtonList呼び出しを初期化した後:

handler.postDelayed(new Runnable() { 
    public void run() {  
        for(Button button : ButtonList) {
            int count = Integer.parseInt(button.getText());
            button.setText(String.valueOf(count));
        }
        handler.postDelayed(this, 1000); // Run this again in one second
    }
}, 1000); 

これにより、各ボタンの値が毎秒増加します。

于 2013-01-03T05:51:00.277 に答える