2015-02-02 2 views
2

Я пытаюсь создать подкласс Button. Код указан нижеButton подкласс onClick не отвечает

package com.comnet.bookshelf; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Paint.Style; 
import android.graphics.Rect; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.widget.Button; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnClickListener; 

public class myButton extends Button implements OnClickListener{ 
    Paint mainPaint; 
    int colorArray[]; 
    int colorArrayAlt[]; 
    boolean touch=false; 
    Rect bound; 
    public myButton(Context context, AttributeSet attrs, int defStyle) 
    { 
     super(context, attrs, defStyle); 
     mainPaint=new Paint(); 
     bound=new Rect(); 
     defaultColorIndexArray(); 
    } 

    public myButton(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 
     mainPaint=new Paint(); 
     bound=new Rect(); 
     defaultColorIndexArray(); 
    } 

    public myButton(Context context) 
    { 
     super(context); 
     mainPaint=new Paint(); 
     bound=new Rect(); 
     defaultColorIndexArray(); 
    } 
    private void defaultColorIndexArray(){ 
     colorArray=new int[]{ 
     0xFFd28181, //1 
     0xFFd48787,  //2 
     0xFFd68d8d, //3 
     0xFFd89292, //4 
     0xFFda9898, //5 
     0xFFdc9e9e, //6 
     0XFFdea2a2, //7 
     0XFFe0a8a8,  //8 
     0xFFe2adad, //9 
     0XFFe3b1b1, //10 
     0XFFe4b4b4, //11 
     0XFFe6b9b9, //12 
     0XFFe7bdbd, //13 
     0XFFe9c0c0, //14 
     0XFFeac3c3, //15 
     0XFFebc6c6, //16 
     0XFFebc7c7, //17 
     0XFFecc9c9, //18 
     0XFFeccaca, //19 
     0XFFeccaca,  //20 
     0XFFeccbcb, //21 
     0XFFeccbcb  //22 
     }; 
     colorArrayAlt=new int[]{ 
     0XFFeccbcb, //22 
     0XFFeccbcb, //21 
     0XFFeccaca, //20 
     0XFFeccaca, //19 
     0XFFecc9c9, //18 
     0XFFebc7c7, //17 
     0XFFebc6c6, //16 
     0XFFeac3c3, //15 
     0XFFe9c0c0, //14 
     0XFFe7bdbd, //13 
     0XFFe6b9b9, //12 
     0XFFe4b4b4, //11 
     0XFFe3b1b1, //10 
     0xFFe2adad, //9 
     0XFFe0a8a8, //8 
     0XFFdea2a2, //7 
     0xFFdc9e9e, //6 
     0xFFda9898, //5 
     0xFFd89292, //4 
     0xFFd68d8d, //3 
     0xFFd48787, //2 
     0xFFd28181 //1 
     }; 
    } 
    public void setButtonColorIndexArray(int carray[], int carray_alt[]){ 
    } 
    @Override 
    protected void onDraw(Canvas canvasObject) { 
     super.onDraw(canvasObject); 
     int draw_color[]; 
     if(touch==false) 
     draw_color=colorArray; 
     else 
     draw_color=colorArrayAlt; 
     int width=canvasObject.getWidth(); 
     int height=canvasObject.getHeight(); 
     double colorcount=44; 
     double divheight=height; 
     double f=colorcount/divheight; 

     double step=0; 
     for(int i=0;i<height;i++,step+=f){ 
     int next=(int) Math.round(step); 
     if(next>43) next=43; 
     else if(next<0)next=0; 
     if(next<22){ 
     mainPaint.setColor(draw_color[next]); 
     canvasObject.drawLine(0, i, width, i, mainPaint); 
     } 
     else{ 
     mainPaint.setColor(draw_color[43-next]); 
     canvasObject.drawLine(0, i, width, i, mainPaint); 
     } 
     //int color=; 
     mainPaint.setColor(getCurrentTextColor()); 

     String str=this.getText().toString(); 
     //mainPaint.setColor(Color.WHITE); 
     mainPaint.setStyle(Style.FILL); 
     //canvasObject.drawPaint(mainPaint); 

     mainPaint.setColor(Color.BLACK); 
     mainPaint.setTextSize(20); 
     mainPaint.getTextBounds(str, 0, str.length(), bound); 
     int x=(width-(bound.right-bound.left))/2; 
     int y=(height+(bound.bottom-bound.top))/2; 

     canvasObject.drawText(str, x, y, mainPaint); 
     } 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent ev){ 
     if(ev.getAction()==MotionEvent.ACTION_DOWN){ 
     //Log.i("Click", "ACTION_DOWN"); 
     touch=true; 
     this.invalidate(); 
     } 
     else if(ev.getAction()==MotionEvent.ACTION_UP){ 
     touch=false; 
     this.invalidate(); 
     } 

     return true; 
    } 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     Log.i("Clicked", "Clicked"); 
    } 
} 

Все, кроме одного, работает так, как я ожидал.

onClick не отвечает вообще. Код, как показано ниже:

((myButton)inflatedLayout.findViewById(R.id.DeleteButton)).setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     DeleteTheEntireBook(); 
    } 
}); 

кнопку с классом по умолчанию работает отлично

Если у вас есть какие-либо дополнительные вопросы, дайте мне знать.

+0

которого OnClick не вызывается? который реализуется в подклассе или том, который используется для удаления книги? –

+0

@KarnShah ни один из них, второй, который я добавил, чтобы проверить поведение. – Popeye

+0

Проблема в том, что * вы переопределили ** onTouchEvent ***. Комметайте его. Вы сможете получить onCllick уволили –

ответ

2

Проблема: вы переопределили onTouchEvent.

Отметьте эти слова:

Вы должны вернуть ложны в вашей OnTouchListener тогда ваш OnClickListener будет также обрабатывается.

Итак, вы можете подумать, я просто сделаю свое дело и вернусь к false, чтобы получить клики тоже. Если вы это сделаете, это будет работать, но вы не будете подписаны на другие предстоящие события касания (ACTION_MOVE, ACTION_UP). Поэтому единственным вариантом является возвращение true там, но тогда вы не получите никаких событий кликов, как мы говорили ранее.

Так что вам нужно выполнить щелчок вручную в ACTION_UP с performClick()

Испытан и рабочий код:

@Override 
    public boolean onTouchEvent(MotionEvent ev) { 
     if (ev.getAction() == MotionEvent.ACTION_DOWN) { 
      // Log.i("Click", "ACTION_DOWN"); 
      touch = true; 
      this.invalidate(); 

     } else if (ev.getAction() == MotionEvent.ACTION_UP) { 
      touch = false; 
      this.invalidate(); 
      // KEY LINE 
      performClick(); 
     } 
     return true; 


    } 

Надеется, что это помогает ツ

+0

Здравствуйте, ツ. Спасибо за ваш ответ. Ваше предложение сработало. Вы задали вопрос о причине обращения с onTouchEvent. Ну, я справился с этим, потому что хочу изменить внешний вид кнопки при прикосновении. Это лучший способ, который я нашел до сих пор. Если вы знаете лучший способ, вы можете мне предложить! Благодарю. – Popeye

+0

Yaa .. вы можете использовать [селектор] (http://stackoverflow.com/a/14024007/2591002) fr. Itz простой способ :) Вам просто нужно преобразовать свой Java-код в XML, хотя это может быть сложно :) Тогда вам не нужно onDraw, а также onTouch –

+0

@SweetWisher ツ Ну, это только начало того, что я хочу достичь :). Это часть моего обучения. – Popeye

0

в конструкторе, добавьте onClickListener, и нет необходимости ((myButton)inflatedLayout.findViewB...

public myButton(Context context, AttributeSet attrs, int defStyle) 
{ 
    super(context, attrs, defStyle); 
    mainPaint=new Paint(); 
    bound=new Rect(); 
    defaultColorIndexArray(); 
    setOnClickListener(this); 
} 

затем в myButton классе переопределена onClick следует называть после того, как кнопка нажата.

+0

Привет, я попробовал ваше предложение. Но это не помогло. Спасибо, что нашли время. – Popeye

0

View.OnClickListener: определение интерфейса для обратного вызова, вызываемого при нажатии на просмотр. Вы можете использовать этот код:

((myButton)inflatedLayout.findViewById(R.id.DeleteButton)).setOnClickListener(new View.OnClickListener() { 
@Override 
public void onClick(View v) { 
    DeleteTheEntireBook(); 
} 

});

+0

Здравствуйте, Rajapandiyan JJ, это было именно то, что я сделал. Я импортировал View.OnCickListener, поэтому я не писал View.OnclickListener. Но спасибо, что нашли время. – Popeye

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