changeset 2614:dbcd9416e9c9

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.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Fri, 23 Jul 2021 14:52:32 +0000
parents 72f1141c07aa
children ac51cbdcfbe5
files android/DWindows.kt
diffstat 1 files changed, 22 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- 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 ->