2012-04-26 3 views
0

ボタンをクリックするとキャンバスを無効にしようとしています。私は、ボタンと1つのレイアウトを持っている私はキャンバスビューを持っています。ボタンをクリックすると、円が表示されなくなります。コードでは、キャンバスを1回だけ無効にすることができます。はじめてボタンを押すと機能します。しかし、私は2回目を押すとうまくいきません。例:私がhideを押すと、それが動作することを示します。しかし、もう一度hideボタンを押すとうまくいきません。私がボタンをクリックすると、毎回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); 
     } 
    } 
} 

誰かがこの質問に対する解決策を持っていると、私の多くの問題を解決できます。

答えて

2

あなたはおそらく、あなたは、それへの参照を保持していないしたいあなたのボタンハンドラに

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

を新しいキャンバスビューのインスタンスを作成しているように見えますか?

EDIT: レイアウト()メソッドでは、ビューインスタンスを作成します。 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); 
     } 
    } 
} 
+0

私はプログラミングがあまりよくありません。参照を保持するとどういう意味ですか?どのように私は参照を保持するのですか? – greenPostIt

+0

詳細を追加するように編集しました – EvilDuck

+0

私が理解している限り、CanvasView cvをグローバル変数にする必要があります。私がCanvasViewを動かすと、cv = new CV(getA()); showCircleブール値の下では、アプリのクラッシュが発生します。私はどのようにクラッシュすることなくCanvasViewのグローバルインスタンスを作成しますか? – greenPostIt

関連する問題