Я работаю над приложением launcher для Android, похожим на nova launcher. У меня есть настройка OnItemLongClickListener и OnDragListener. Когда я долго нажимаю на значок, появляется всплывающее меню с меню, например "Удалить", "Изменить значок" и т.д. На следующем рисунке показано, как работает приложение с всплывающим окном, а затем Длительное нажатие.
Проблема заключается в том, что всплывающее окно открывается, но переключение не работает. Кажется, что я не могу зарегистрировать позицию x, y, когда всплывающее окно открыто. Также при выполнении кавычек в logcat отображается следующее сообщение.
I/ViewRootImpl: Reporting drop result: false
Мой код выглядит примерно так в OnDragListener
public boolean onDrag(View v, DragEvent event) {
int dragEvent = event.getAction();
switch (dragEvent)
{
case DragEvent.ACTION_DRAG_LOCATION:
//Open popup here; note: its opened only once. popup.show();
//Log.i("Position x : ", Float.toString(event.getX())); log x or y
/*code to detect x any y change amount and close the popup
once user drags the icon little further and app knows that
user is trying to drag instead of opening the popup
and hence close the popup. popup.dismiss();
*/
// other case like ACTION_DROP etx goes after this
}
}
Но кажется, что после всплывающего окна я не могу зарегистрировать x или y; также не может быть запущен код, определяющий, было ли действие предназначено для "перетаскивания" или "всплывающего окна".
Итак, как я могу решить эту проблему? Я хочу закрыть всплывающее окно, как только количество перетаскивания в любом из них достаточно, чтобы знать, что пользователь хочет перетащить. И если не остановить перетаскивание и отобразить всплывающее окно.
Edit
Я решил проблему с помощью всплывающего окна, используя как OnTouchListner, так и OnDragListner. Следующий показывает мой код для OnDragListner.
//bottomAppDrawer is a GridView
bottomAppDrawer.setOnDragListener(new View.OnDragListener() {
@Override
public boolean onDrag(View v, DragEvent event) {
int dragEvent = event.getAction();
LinearLayout draggedItem = (LinearLayout) event.getLocalState(); //dragged LinearLayout
GridView targetItem = (GridView) v; /* How do i get this drop target as LinearLayout so that i can delete or swap data */
switch (dragEvent)
{
case DragEvent.ACTION_DRAG_LOCATION:
if(reset==false) {
dragPositionStart = event.getX();
reset= true;
}
if(Math.abs(dragPositionStart - event.getX())>=20) {
Log.i("Position close : ", Float.toString(dragPositionStart));
if(isPopupOpen) {
popupMenu.dismiss();
v.startDrag(data, dragShadow, itemView, 0);
Toast.makeText(mContext, "popup closed", Toast.LENGTH_SHORT).show();
isPopupOpen = false;
}
reset = false;
}
break;
case DragEvent.ACTION_DROP:
Toast.makeText(mContext, "drop" + Integer.toString(targetItem.getChildCount()), Toast.LENGTH_SHORT).show();
break;
}
return true;
}
});
Теперь проблема в том, что я получаю целевой объект "Gridview" , поскольку я бросаю LinearLayout в "Gridview" . Кроме того, этот "LinearLayout" является дочерним элементом "Gridview" . И я хочу, чтобы цель кавычки была другой "LinearLayout" внутри одного и того же "GridView", чтобы я мог менять данные или переупорядочивать. Как показано на рисунке ниже.