# import相关库
from kivy.app import App
from kivy.clock import Clock
from kivy.uix.button import Button
from kivy.core.window import Window
from android.runnable import run_on_ui_thread
from jnius import autoclass, cast, PythonJavaClass, java_method
# 定义java类库
WebView = autoclass("android.webkit.WebView")
WebViewClient = autoclass("android.webkit.WebViewClient")
LayoutParams = autoclass('android.view.ViewGroup$LayoutParams')
KeyEvent = autoclass('android.view.KeyEvent')
activity = autoclass("org.kivy.android.PythonActivity").mActivity
# 重写java事件监听类
class KeyListener(PythonJavaClass):
__javacontext__ = 'app'
__javainterfaces__ = ['android/view/View$OnKeyListener']
def __init__(self, listener):
self.listener = listener
@java_method('(Landroid/view/View;ILandroid/view/KeyEvent;)Z')
def onKey(self, v, key_code, event):
if event.getAction() == KeyEvent.ACTION_DOWN and key_code == KeyEvent.KEYCODE_BACK:
return self.listener()
# 定义MainApp
class MainApp(App):
webview = None
def build(self):
Window.bind(on_keyboard=self.listen_for_keyboard)
return Button(
text= 'open web',
on_release=self.open_url)
def open_url(self,*argv):
Clock.schedule_once(lambda *args:self.create_webview("https://baidu.com"), 0)
@run_on_ui_thread
def create_webview(self, url):
# 设置WebView
self.webview = WebView(activity)
settings = self.webview.getSettings()
settings.setJavaScriptEnabled(True)
settings.setUseWideViewPort(True)
settings.setLoadWithOverviewMode(True)
settings.setSupportZoom(True)
#settings.setBuiltInZoomControls(True)
# 设置WebViewClient
wvc = WebViewClient()
self.webview.setWebViewClient(wvc)
# 设置WebView布局
self.webview.setLayoutParams(LayoutParams(
LayoutParams.FILL_PARENT,
LayoutParams.FILL_PARENT))
activity.getLayout().addView(self.webview)
# 设置WebView监听
self.webview.setOnKeyListener(KeyListener(self.listen_java_webview))
self.webview.loadUrl(url)
@run_on_ui_thread
def on_back_webview(self):
if self.webview.canGoBack():
self.webview.goBack()
else:
self.webview.clearHistory()
self.webview.clearCache(True)
self.webview.loadUrl("about:blank")
self.webview.freeMemory()
activity.getLayout().removeView(self.webview)
self.webview = None
def listen_for_keyboard(self, instance, keyboard, keycode, text, modifiers):
if keyboard == 27:
if self.webview:
self.on_back_webview()
else:
return False
return True
def listen_java_webview(self, *args):
if self.webview:
self.on_back_webview()
else:
return False
return True
MainApp().run()