2015-10-23 2 views
1

У меня есть ImageView в FrameLayout, я хочу настроить LongClickListener, но он не работает, я попытался настроить OnTouchListener и его работу безупречно, у меня нет ни малейшего представления о том, почему не работает, но ниже мой код код:OnLongClickListener не работает в пользовательских framelayout Android

public class DragImageView extends FrameLayout implements View.OnLongClickListener { 
ImageView ivDrag; 

public DragImageView(Context context) { 
    super(context); 


} 



public DragImageView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 



public DragImageView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 

@TargetApi(Build.VERSION_CODES.HONEYCOMB) 
public void AddImageView(View draggableObject, int x, int y, int width, int height) { 
    LayoutParams lpDraggableView = new LayoutParams(width, height); 
    lpDraggableView.gravity = Gravity.TOP; 
    lpDraggableView.leftMargin = x; 
    lpDraggableView.topMargin = y; 
    if(draggableObject instanceof ImageView) { 
     this.ivDrag = (ImageView) draggableObject; 
     ivDrag.setLayoutParams(lpDraggableView); 
     ivDrag.setClickable(true); 
     ivDrag.setLongClickable(true); 
     ivDrag.setOnLongClickListener(this); 
     this.addView(ivDrag); 

    } 

} 

/** 
* Draggable object ontouch listener 
* Handle the movement of the object when dragged and dropped 
*/ 
private View.OnTouchListener OnTouchToDrag =new View.OnTouchListener() { 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     FrameLayout.LayoutParams dragParam = (LayoutParams) v.getLayoutParams(); 
     switch(event.getAction()) 
     { 
      case MotionEvent.ACTION_MOVE: 
      { 

       dragParam.topMargin = (int)event.getRawY() - (v.getHeight()); 
       dragParam.leftMargin = (int)event.getRawX() - (v.getWidth()/2); 
       v.setLayoutParams(dragParam); 
       break; 
      } 
      case MotionEvent.ACTION_UP: 
      { 
       dragParam.height = v.getHeight(); 
       dragParam.width = v.getWidth(); 
       dragParam.topMargin = (int)event.getRawY() - (v.getHeight()); 
       dragParam.leftMargin = (int)event.getRawX() - (v.getWidth()/2); 
       v.setLayoutParams(dragParam); 
       break; 
      } 
      case MotionEvent.ACTION_DOWN: 
      { 
       dragParam.height = v.getHeight();//fixed on drag and drop 
       dragParam.width = v.getWidth(); 
       v.setLayoutParams(dragParam); 
       break; 
      } 
     } 
     return true; 
    } 

}; 




@Override 
public boolean onLongClick(View view) { 
    ivDrag.setOnTouchListener(OnTouchToDrag); 
    Toast.makeText(view.getContext(), "OnLongClick", Toast.LENGTH_SHORT).show(); 
    return false; 
} 
} 
+0

Почему один из ваших конструкторов называется DragDropView? Также, вообще говоря, предлагается не использовать instanceof. – geokavel

+0

Извините, что при вставке кода из моего редактора, на самом деле DragImageView, это была ошибка опечатки, что, по вашему мнению, может быть проблемой, я пытался что-то попробовать, и это сработало, за исключением того, что это не изображение, которое получает LongClickListener, его Windows содержащий изображение. –

+0

Я не уверен. Просто для тестирования вы пытались изменить его на прослушиватель OnClick и посмотреть, работает ли это? – geokavel

ответ

0

Я хочу настройки LongClickListener, но его неспособность работать

Вы не получаете обратные вызовы от OnLongClickListener, потому что он не имеет набор слушателя. Так как ваш класс реализует View.OnLongClickListener и вы хотите получить обратный вызов в свой переопределенный метод onLongClick(), добавьте этот класс в качестве слушателя, и он будет работать. Я сделал это в конструктор (выберите соответствующий конструктор из трех, как в вашей инициализации зрения):

public DragImageView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    this.setOnLongClickListener(this); // <-- set this class instance as the listener 
} 

Хотя я удивляюсь, как вы получили его работы с OnTouchListener. Вы, вероятно, явно добавили слушателя, не так ли?

+0

Посмотрите на его метод AddImageView. – geokavel

+1

@geokavel этот метод никогда не называется, насколько я могу видеть. Слушатель должен быть добавлен либо в (1) конструктор, либо (2), используя 'setOnLongClickListener()' в экземпляре 'DragImageView', полученном' findViewById() 'в каком-то другом классе. Или просто вызовите метод AddImageView из конструктора. – bitbybit

+1

Некоторые другие классы определенно называют это, потому что он перетаскивает imageView в FrameLayout, а не сам FrameLayout. Он сказал, что отлично работает, когда он изменил все на OnClickListener, он просто не работает с OnLongClickListener. – geokavel

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