2012-04-26 2 views
0

Im пытается аннулировать мой холст, когда я нажимаю на кнопку. У меня есть один макет с кнопками и у меня есть холст. Когда я нажимаю на кнопку, круг должен скрываться или отображаться. В коде теперь я могу аннулировать мой холст только один раз. Когда я нажимаю кнопку при первом запуске. Но когда я нажимаю второй раз, он не работает. Пример: Если я нажму «скрыть», то покажу, что он работает. Но когда я снова нажимаю кнопку скрыть, это не работает. Когда я нажимаю на кнопку, я хочу, чтобы 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: в вашем методе 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); 
     } 
    } 
} 
+0

Я не очень хорошо программирую. Что вы имеете в виду, поддерживая ссылку? Как сохранить ссылку? – greenPostIt

+0

Я отредактировал для более подробной информации – EvilDuck

+0

Если я правильно понимаю, я должен сделать CanvasView cv глобальной переменной. Когда я перемещаю CanvasView cv = новое CV (getA()); под showCircle boolean приложения chrashes. Как сделать глобальный экземпляр CanvasView без сбоев? – greenPostIt

Смежные вопросы