• Android使用Html绘制页面


         今天给大家分享一个有意思的东西,android本身提供的布局已经非常完善,但是如果绘制过于复杂的页面会很麻烦,webView控件一般用来加载网页,同时我们也可以尝试加载本地的html文件,下面给大家介绍一个简单的Demo;

        1.附上一个文件,mainTest.html,建议大家在自己电脑上新建个.txt文本文件,将Html内容放入里面,再将.txt文件修改成.html文件,完成之后将该文件放入asset文件夹下,如果有附属的;

    <html>
    <script language="javascript">
        /* This function is invoked by the activity */
        /* 这个函数被Activity调用的活动 这里的图片我们可以在它的连接里面下载 android_waving.png */
        function wave() {
        /* 这里是一个javascript 自定义函数,这是由我们在android的程序里调用的,不在在HTML中调用*/
        document.getElementById("droid").src="ic_launcher.png";
        }
        function hellow(){
            alert('hellow world');
        document.getElementById("droid").src="ic_launcher.png";
        }
    </script>
    <body>
    <!-- Calls into the javascript interface for the activity -->
    <!-- 从HTML文件中调用activity中的函数 -->
    <!-- 也就是从HTML到android程序 留意window.demo.clickOnAndroid()这句话 -->
    <a onClick="window.asdasd.clickOnAndroid()">
        <div style="80px;
                            margin:0px auto;
                            padding:10px;
                            text-align:center;
                            border:2px solid #202020;">
            <!-- 图片默认的为 android_normal.png -->
            <img id="droid" src="android_normal.png"/><br>
            Click me!
        </div>
    </a>
    <br>
    <button onclick="window.my.show()">click</button>
    </body>
    </html>

        我自己不了解HTML,上部分参考就就OK,如果有附属的.css和.js文件就一并复制;

       2.Activity调用  这部分我会详细介绍

        ①XML布局

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context=".MainActivity" >
    
        <WebView
            android:id="@+id/webView"
            android:layout_width="fill_parent"
            android:layout_height="match_parent" />
    
    </RelativeLayout>

        ② Activity代码

    package com.example.androidhtmldemo;
    
    import android.annotation.SuppressLint;
    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.util.Log;
    import android.webkit.JsResult;
    import android.webkit.WebChromeClient;
    import android.webkit.WebSettings;
    import android.webkit.WebView;
    import android.widget.Toast;
    
    @SuppressLint("JavascriptInterface") public class MainActivity extends Activity {
        /**
         * Called when the activity is first created.
         */
    //    @Override
    //    public void onCreate(Bundle savedInstanceState) {
    //        super.onCreate(savedInstanceState);
    //        setContentView(R.layout.main);
    //    }
        private static final String LOG_TAG = "WebViewDemo";
        private WebView mWebView;
        private Handler mHandler = new Handler();
        @SuppressLint("JavascriptInterface") @Override
        public void onCreate(Bundle icicle) {
            super.onCreate(icicle);
            setContentView(R.layout.activity_main);
            Toast.makeText(MainActivity.this,"HELLOW WORLD", Toast.LENGTH_LONG).show();
    
            mWebView = (WebView) findViewById(R.id.webView);
    
    
            WebSettings webSettings = mWebView.getSettings();
            webSettings.setSavePassword(false);
            webSettings.setSaveFormData(false);
            // 下面的一句话是必须的,必须要打开javaScript不然所做一切都是徒劳的
            webSettings.setJavaScriptEnabled(true);
            webSettings.setSupportZoom(false);
    
    
            mWebView.setWebChromeClient(new MyWebChromeClient());
    
            // 看这里用到了 addJavascriptInterface 这就是我们的重点中的重点
            // 我们再看他的DemoJavaScriptInterface这个类。还要这个类一定要在主线程中
            mWebView.addJavascriptInterface(new DemoJavaScriptInterface(), "asdasd");
            mWebView.addJavascriptInterface(new myHellowWorld(),"my");
    
            mWebView.loadUrl("file:///android_asset/main.html");
        }
    
        class myHellowWorld{
            myHellowWorld(){
    
            }
            public void show(){
                mHandler.post(new Runnable(){
    
                @Override
                public void run() {
                    Toast.makeText(MainActivity.this,"HELLOW WORLD", Toast.LENGTH_LONG).show();
                }
            });
            }
        }
        // 这是他定义由 addJavascriptInterface 提供的一个Object
        final class DemoJavaScriptInterface {
            DemoJavaScriptInterface() { 
            }
    
            /**
             * This is not called on the UI thread. Post a runnable to invoke
             * 这不是呼吁界面线程。发表一个运行调用
             * loadUrl on the UI thread.
             * loadUrl在UI线程。
             */
            public void clickOnAndroid() {        // 注意这里的名称。它为clickOnAndroid(),注意,注意,严重注意
                mHandler.post(new Runnable() {
                    public void run() {
                        // 此处调用 HTML 中的javaScript 函数
                        mWebView.loadUrl("javascript:wave()");
                    }
                });
            }
        }
    // 线下的代码可以不看,调试用的
    ///////////////////////////////////////////////////////////////////////////////////////////////////
        /**
         * Provides a hook for calling "alert" from javascript. Useful for
         * 从javascript中提供了一个叫“提示框” 。这是很有用的
         * debugging your javascript.
         *  调试你的javascript。
         */
        final class MyWebChromeClient extends WebChromeClient {
            @Override
            public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
                Log.d(LOG_TAG, message);
                result.confirm();
                return true;
            }
        }
    
    }

       ③相关类及方法

        addJavaScriptInterface 这个方法非常重要,通过它来实现我们的代码和HTML实现交互,需要传递两个参数,第一个参数:

              .绑定到JavaScript的类的实例,这个类有两地啊要说明:1)类中的方法如果需要HTML调用则必须方法名必须与HTML中保持一致 2)HTML和我们的Project若要实现交互必须建立新的线程,使用handler来更新我们的代码,可以想见代码;

              .用来显示在JavaScript中的实例,简单的说就是与第一个参数绑定的标签,在HTML中可以通过这个标签来调用第一个参数所拥有的方法;

           loadUrl   1)加载网页 :loadUrl("http://www.baidu.com/"); 

                        2)加载SD卡内资源:loadUrl("file:///mnt/sdcard/Google.html");

                        3)加载assets文件夹内资源 :loadUrl("file:///android_asset/Google.html"); 

        android使用HTML今天就介绍到这,欢迎大家交流~

           

  • 相关阅读:
    【Network】OVS、VXLAN/GRE、OVN等 实现 Docker/Kubernetes 网络的多租户隔离
    【openStack】Libcloud 如何支持 keystone V3?
    【Network】修改docker启动默认网桥docker0为自定义网桥
    【Network】TCPDUMP 详解
    【Network】OVS基础知识
    【Docker】Docker主机为什么ip nets 查不到网络空间
    sql-in/not in和exists/not exists的区别
    sql-exists和not exists
    oracle-分页查询方案
    mysql-函数FOUND_ROWS()
  • 原文地址:https://www.cnblogs.com/ZhangXiangQian/p/4913540.html
Copyright © 2020-2023  润新知