Skip to content

Commit 94a437f

Browse files
committed
Add Button event handlers
1 parent 2eb0384 commit 94a437f

File tree

4 files changed

+41
-8
lines changed

4 files changed

+41
-8
lines changed

apps/android_pythonnative_3/app/src/main/python/app/main_3.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,12 @@ def __init__(self, native_instance):
88
def on_create(self):
99
super().on_create()
1010
stack_view = pn.StackView(self.native_instance)
11-
list_data = ["item_{}".format(i) for i in range(100)]
12-
list_view = pn.ListView(self.native_instance, list_data)
13-
stack_view.add_view(list_view)
11+
# list_data = ["item_{}".format(i) for i in range(100)]
12+
# list_view = pn.ListView(self.native_instance, list_data)
13+
# stack_view.add_view(list_view)
14+
button = pn.Button(self.native_instance, "Button")
15+
button.set_on_click(lambda: print("Button was clicked!"))
16+
stack_view.add_view(button)
1417
self.set_root_view(stack_view)
1518

1619
def on_start(self):

apps/android_pythonnative_3/app/src/main/python/app/second_page.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ def __init__(self, native_instance):
88
def on_create(self):
99
super().on_create()
1010
stack_view = pn.StackView(self.native_instance)
11-
label = pn.Label(self.native_instance, "Label")
12-
stack_view.add_view(label)
11+
button = pn.Button(self.native_instance, "Button")
12+
button.set_on_click(lambda: print("Button was clicked!"))
13+
stack_view.add_view(button)
1314
self.set_root_view(stack_view)
1415

1516
def on_start(self):

libs/pythonnative/pythonnative/button.py

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from abc import ABC, abstractmethod
2+
from typing import Callable
23
from .utils import IS_ANDROID
34
from .view import ViewBase
45

@@ -20,13 +21,17 @@ def set_title(self, title: str) -> None:
2021
def get_title(self) -> str:
2122
pass
2223

24+
@abstractmethod
25+
def set_on_click(self, callback: Callable[[], None]) -> None:
26+
pass
27+
2328

2429
if IS_ANDROID:
2530
# ========================================
2631
# Android class
2732
# ========================================
2833

29-
from java import jclass
34+
from java import dynamic_proxy, jclass
3035

3136
class Button(ButtonBase, ViewBase):
3237
def __init__(self, context, title: str = "") -> None:
@@ -41,12 +46,26 @@ def set_title(self, title: str) -> None:
4146
def get_title(self) -> str:
4247
return self.native_instance.getText().toString()
4348

49+
def set_on_click(self, callback: Callable[[], None]) -> None:
50+
class OnClickListener(
51+
dynamic_proxy(jclass("android.view.View").OnClickListener)
52+
):
53+
def __init__(self, callback):
54+
super().__init__()
55+
self.callback = callback
56+
57+
def onClick(self, view):
58+
self.callback()
59+
60+
listener = OnClickListener(callback)
61+
self.native_instance.setOnClickListener(listener)
62+
4463
else:
4564
# ========================================
4665
# iOS class
4766
# ========================================
4867

49-
from rubicon.objc import ObjCClass
68+
from rubicon.objc import ObjCClass, SEL
5069

5170
class Button(ButtonBase, ViewBase):
5271
def __init__(self, title: str = "") -> None:
@@ -60,3 +79,12 @@ def set_title(self, title: str) -> None:
6079

6180
def get_title(self) -> str:
6281
return self.native_instance.titleForState_(0)
82+
83+
def set_on_click(self, callback: Callable[[], None]) -> None:
84+
def objc_callback(_cmd, sender):
85+
callback()
86+
87+
action = SEL(objc_callback)
88+
self.native_instance.addTarget_action_forControlEvents_(
89+
self.native_instance, action, 1
90+
)

libs/pythonnative/pythonnative/page.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,4 +183,5 @@ def on_restore_instance_state(self) -> None:
183183

184184
def navigate_to(self, page) -> None:
185185
self.native_instance.navigationController().pushViewControllerAnimated_(
186-
page.native_instance, True)
186+
page.native_instance, True
187+
)

0 commit comments

Comments
 (0)