1

のサブクラスを作成したいのですがlinear layout、背景色を黒または白に変更する必要があります。次のコードを記述しました。

public class MyLayout extends LinearLayout implements Runnable {

    int color = 0xFFFFFFFF;

    public MyLayout(Context context) {
        super(context);
        Thread t = new Thread(this);
        t.start();
    }

    @Override
    public void run() {
        while (true) {
            try {
                Thread.sleep(1000);
                if(color == 0xFF000000){
                    color = 0xFFFFFFFF;
                }else{
                    color = 0xFF000000;
                }
                this.setBackgroundColor(color);
                postInvalidate();
                System.out.println("Color >> " + color);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }

}

そして、それを自分のアクティビティのContentViewとして設定します。

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new MyLayout(this));
    }

エミュレータでアプリを実行した後、runメソッドはMyLayout例外なく実行されますが、背景色は常に黒です。何が間違っているのですか?

4

4 に答える 4

2

こんにちはこれを試してみてください。

public class MyLayout extends LinearLayout implements Runnable {

    int color = 0xFFFFFFFF;

    public MyLayout(Context context) {
        super(context);
        myView = this;
        Thread t = new Thread(this);
        t.start();
    }

    private View myView;

    @Override
    public void run() {

        try {
            while (true) {
                Thread.sleep(1000);

                runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        if (color == 0xFF000000) {
                            color = 0xFFFFFFFF;
                        } else {
                            color = 0xFF000000;
                        }
                        myView.setBackgroundColor(color);
                        postInvalidate();
                        System.out.println("Color >> " + color);
                    }
                });
            }
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

他のスレッドを介してユーザーインターフェイスに変更を加える場合は、runOnUiThread内でコードを実行してください。

于 2013-01-07T16:30:25.473 に答える
1

postInvalidate()を試した場所でinvalidate()を試してください

その他のヒント:レイアウトサイズを指定せずに、新しいLinearLayoutを作成しています。 setContentViewを使用する前に、setLayoutParams()を使用することをお勧めします。

MyLayout layout = new MyLayout(this);
layout.setLayoutParams(new LayoutParams(...));
this.setContentView(layout);

この時点で、0サイズ(高さと幅)の新しいレイアウトを作成しています。

于 2013-01-07T16:26:19.107 に答える
0

スレッドでこれを変更することはできませんAsynctaskを使用してください

https://developer.android.com/reference/android/os/AsyncTask.html

 protected void onPostExecute(Long result) {
         //HERE YOU CAN CHANGE THE COLOR
      }
于 2013-01-07T17:17:47.217 に答える
0

@Hisham Muneerをフォローアップする際に、アクティビティのインスタンスをクラスに送信すると、機能します。runOnUiThreadはクラスのメソッドActivityです。これは最終的なコードです。

public class MyLayout extends LinearLayout implements Runnable {

    int color = 0xFFFFFFFF;
    Activity context;

    public MyLayout(Activity context) {
        super(context);
        this.context = context;
        myView = this;
        Thread t = new Thread(this);
        t.start();
    }

    private View myView;

    @Override
    public void run() {

        try {
            while (true) {
                Thread.sleep(1000);

                context.runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        if (color == 0xFF000000) {
                            color = 0xFFFFFFFF;
                        } else {
                            color = 0xFF000000;
                        }
                        myView.setBackgroundColor(color);
                        postInvalidate();
                        System.out.println("Color >> " + color);
                    }
                });
            }
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}
于 2013-01-07T18:42:54.460 に答える