# HG changeset patch # User bsmith@81767d24-ef19-dc11-ae90-00e081727c95 # Date 1627051952 0 # Node ID dbcd9416e9c9a1c87ca55884147a4466f4d4ffb1 # Parent 72f1141c07aaca8311398a54b48f09f19b1d0ed3 Android: Popup menus on Andoird use an anchor View not the touch location. The parent parameter passed probably will not be the ideal anchor. The two options are to hit test the touch event coordinates of the x/y parameters. Or, the solution I did in this commit, saving the View of the last click event and if it is valid, use that View as the anchor. This works well in the test program but may need to revisit this later. diff -r 72f1141c07aa -r dbcd9416e9c9 android/DWindows.kt --- a/android/DWindows.kt Sun Jul 18 21:21:49 2021 +0000 +++ b/android/DWindows.kt Fri Jul 23 14:52:32 2021 +0000 @@ -743,6 +743,7 @@ var threadCond = threadLock.newCondition() var notificationID: Int = 0 var darkMode: Int = -1 + var lastClickView: View? = null private var paint = Paint() private var bgcolor: Int = 0 private var menuBar: DWMenu? = null @@ -838,8 +839,15 @@ fun menuPopup(menu: DWMenu, parent: View, x: Int, y: Int) { + var anchor: View? = parent + + // If lastClickView is valid, use that instead of parent + if(lastClickView != null) { + anchor = lastClickView + } + runOnUiThread { - val popup = PopupMenu(this, parent) + val popup = PopupMenu(this, anchor) menu.createMenu(popup.menu) popup.show() @@ -1417,6 +1425,7 @@ button!!.text = text button!!.id = cid button!!.setOnClickListener { + lastClickView = button!! eventHandlerSimple(button!!, 8) } } @@ -1433,6 +1442,7 @@ button!!.id = resid button!!.setImageResource(resid) button!!.setOnClickListener { + lastClickView = button!! eventHandlerSimple(button!!, 8) } } @@ -1449,6 +1459,7 @@ button!!.tag = dataArrayMap button!!.id = cid button!!.setOnClickListener { + lastClickView = button!! eventHandlerSimple(button!!, 8) } @@ -1479,6 +1490,7 @@ button!!.tag = dataArrayMap button!!.id = cid button!!.setOnClickListener { + lastClickView = button!! eventHandlerSimple(button!!, 8) } button!!.setImageBitmap(b) @@ -1521,6 +1533,7 @@ radiobutton!!.id = cid radiobutton!!.text = text radiobutton!!.setOnClickListener { + lastClickView = radiobutton!! eventHandlerSimple(radiobutton!!, 8) } } @@ -1538,6 +1551,7 @@ checkbox!!.id = cid checkbox!!.text = text checkbox!!.setOnClickListener { + lastClickView = checkbox!! eventHandlerSimple(checkbox!!, 8) } } @@ -2153,6 +2167,7 @@ view.isSelected = !view.isSelected adapter.selectedItem = position + lastClickView = cont!! // If we are single select or we got a double tap... // Generate an ENTER event if(cont!!.choiceMode != ListView.CHOICE_MODE_MULTIPLE || @@ -2171,6 +2186,7 @@ val title = adapter.model.getRowTitle(adapter.selectedItem) val data = adapter.model.getRowData(adapter.selectedItem) + lastClickView = cont!! eventHandlerContainer(cont!!, 10, title, 0, 0, data) } true @@ -2179,6 +2195,7 @@ val title = adapter.model.getRowTitle(position) val data = adapter.model.getRowData(position) + lastClickView = cont!! eventHandlerContainer(cont!!, 10, title, 0, 0, data) true } @@ -2902,11 +2919,13 @@ MotionEvent.ACTION_UP -> { render!!.evx = event.x render!!.evy = event.y + lastClickView = render!! eventHandlerInt(render!!, 4, event.x.toInt(), event.y.toInt(), render!!.button, 0) } MotionEvent.ACTION_MOVE -> { render!!.evx = event.x render!!.evy = event.y + lastClickView = render!! eventHandlerInt(render!!, 5, event.x.toInt(), event.y.toInt(), 1, 0) } } @@ -2916,12 +2935,14 @@ render!!.setOnLongClickListener{ // Long click functions as button 2 render!!.button = 2 + lastClickView = render!! eventHandlerInt(render!!, 3, render!!.evx.toInt(), render!!.evy.toInt(), 2, 0) true } render!!.setOnClickListener{ // Normal click functions as button 1 render!!.button = 1 + lastClickView = render!! eventHandlerInt(render!!, 3, render!!.evx.toInt(), render!!.evy.toInt(), 1, 0) } render!!.setOnKeyListener(View.OnKeyListener { v, keyCode, event ->