0

ボタンをクリックしたときにキャンバスを無効にしようとしています。ボタン付きのレイアウトが1つあり、その下にキャンバスビューがあります。ボタンをクリックすると、円が非表示または表示されます。コードでは、キャンバスを無効にできるのは1回だけです。初めてボタンを押すと動作します。しかし、2回押すと機能しません。例:非表示を押すと、それが機能することを示します。しかし、もう一度非表示ボタンを押すと機能しません。ボタンをクリックすると、CanvasViewを毎回無効にします。初めてだけではありません。

public class CanvasWithButtonsActivity extends Activity {
    boolean showCircle = true;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(layout());

        findViewById(R.id.buttonHide).setOnClickListener(
                new OnClickListener() {      
                public void onClick(View v) {
                    //HIDE
                    showCircle = false;
                    //How do i invalidate my canvas from here?
                    CanvasView cv = new CanvasView(getApplicationContext());
                        cv.invalidate();
                }  
        });

        findViewById(R.id.buttonShow).setOnClickListener(
                new OnClickListener() {      
                public void onClick(View v) {
                    //SHOW
                    showCircle = true;
                    //How do i invalidate my canvas from here?
                    CanvasView cv = new CanvasView(getApplicationContext());
                        cv.invalidate();
                }  
        });
    }

    public RelativeLayout layout(){
        RelativeLayout mainLayout = new RelativeLayout(this);
        mainLayout.setLayoutParams(new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.FILL_PARENT,
                LinearLayout.LayoutParams.FILL_PARENT, 1));
        mainLayout.setBackgroundColor(Color.WHITE);

        View buttonLayout = LayoutInflater.from(getBaseContext()).inflate(R.layout.main, null);
        buttonLayout.setLayoutParams(new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.FILL_PARENT,
                LinearLayout.LayoutParams.FILL_PARENT, 1));
        CanvasView cv = new CanvasView(getApplicationContext());
        mainLayout.addView(cv);
        mainLayout.addView(buttonLayout);

        return mainLayout;
    }

    private class CanvasView extends View{

        public CanvasView(Context context) {
            super(context);
            // TODO Auto-generated constructor stub
        }

        protected void onDraw(Canvas myCanvas){
            Paint myPaint = new Paint();
            myPaint.setColor(Color.BLUE);
            if(showCircle == true)
                myCanvas.drawCircle(myCanvas.getWidth()/2, 100, 20, myPaint);
        }
    }
}

誰かがこの質問に対する解決策を持っているなら、それは私の問題の多くを解決するでしょう。

4

1 に答える 1

2

ボタンハンドラーで新しいキャンバスビューインスタンスを作成しているようです

CanvasView cv = new CanvasView(getApplicationContext());
cv.invalidate();

あなたはおそらくそれへの参照を保持したいと思いませんか?

編集:layout()メソッドで、ビューインスタンスを作成します。ここでのcvはそれへの参照です。それはあなたのメソッドにとってローカルです:

CanvasView cv = new CanvasView(getApplicationContext());
mainLayout.addView(cv);
mainLayout.addView(buttonLayout);

グローバルにしたい(つまり、クラスフィールド)。基本的に、Javaインスタンス変数(ブール値の「showCircle」フラグなど)。ブール値の「showCircle」フラグを変更するのと同じ方法で、リスナーコードから使用できます。

また、XMLを使用したレイアウトの作成と、findViewByIdメソッドを使用したビューの検索について詳しく読むことをお勧めします。

EDIT2:インスタンス変数を使用すると、コードは次のようになります。(メモ帳に入力していた可能性のあるエラー):

public class CanvasWithButtonsActivity extends Activity {
    boolean showCircle = true;
    private CanvasView mCanvasView;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(layout());

        findViewById(R.id.buttonHide).setOnClickListener(
                new OnClickListener() {      
                public void onClick(View v) {
                    //HIDE
                    showCircle = false;
                    //How do i invalidate my canvas from here?
                    if (mCanvasView != null) {
                        mCanvasView.invalidate();
                    }
                }  
        });

        findViewById(R.id.buttonShow).setOnClickListener(
                new OnClickListener() {      
                public void onClick(View v) {
                    //SHOW
                    showCircle = true;
                    //How do i invalidate my canvas from here?
                    if (mCanvasView != null) {
                        mCanvasView.invalidate();
                    }
                }  
        });
    }

    public RelativeLayout layout(){
        RelativeLayout mainLayout = new RelativeLayout(this);
        mainLayout.setLayoutParams(new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.FILL_PARENT,
                LinearLayout.LayoutParams.FILL_PARENT, 1));
        mainLayout.setBackgroundColor(Color.WHITE);

        View buttonLayout = LayoutInflater.from(getBaseContext()).inflate(R.layout.main, null);
        buttonLayout.setLayoutParams(new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.FILL_PARENT,
                LinearLayout.LayoutParams.FILL_PARENT, 1));
        mCanvasView = new CanvasView(getApplicationContext());
        mainLayout.addView(mCanvasView);
        mainLayout.addView(buttonLayout);

        return mainLayout;
    }

    private class CanvasView extends View{

        public CanvasView(Context context) {
            super(context);
            // TODO Auto-generated constructor stub
        }

        protected void onDraw(Canvas myCanvas){
            Paint myPaint = new Paint();
            myPaint.setColor(Color.BLUE);
            if(showCircle == true)
                myCanvas.drawCircle(myCanvas.getWidth()/2, 100, 20, myPaint);
        }
    }
}
于 2012-04-26T12:03:26.427 に答える