kivy webview例子

cooolr 于 2021-05-08 发布
# 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()