Android混合開發之仿微信朋友圈

bn6102 8年前發布 | 20K 次閱讀 安卓開發 Android開發 移動開發

開發之前

大約從去年開始吧, 也可能是前年 Html5好像火得不得了, 不得了...總能從網上聽說到 XXX混合開發, 為了緊跟潮流(雖然有點兒晚了), 咱們也看看Android+Html5混合開發是怎樣的!

今天帶來的案例是微信的朋友圈, 因為我覺得是微信把H5給"捧紅了". 不過丑話說在前頭, 咱們的仿朋友圈可是"低仿", 只是把混合開發的大致流程說說, 界面可能不堪入目...見諒..

開發環境

  • Android Studio 2.2.2

  • JDK1.7

  • API 24

  • Gradle 2.2.2

  • jQuery v3.1.1

相關知識點

  • webView的使用

  • Json的解析和生成(本案例使用GSON)

  • Html和js基礎(為方便, 本案例使用了jQuery)

  • Java和js的交互

我覺得上述Android方面知識點對大家應該不算困難. 在H5和js方面我了解的也不是特別深入, 會用用基本的就夠了, 實在不行就 w3school !, 你懂得

開始開發

案例預覽

上面說了, 請原諒界面的不堪入目....

WeiChatFriends.gif

案例分析

說混合開發, 其實就是在WebView上顯示本地的Html文件, 所以我們要解決的問題就是如何將Java的數據傳送到Html文件中并且通過JS進行動態的顯示.

本案例的思路是, 在Activity中生成Json數據(這些Json數據都是假數據, 在項目可以直接從網絡中獲取Json數據), Json數據通過與JS的交互, 在JS中接收到消息, 然后動態生成Html的Item顯示在WebView上! 并且每個item都有相應的點擊事件, 點擊后回調Android系統的Toast, 彈出當前點擊內容.

搭建布局

額..其實就是一個WebView

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:orientation="vertical"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.lulu.weichatfriends.MainActivity">
    <WebView
        android:id="@+id/main_web_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</LinearLayout>

實體類準備

本例中用于封裝json數據

public class FriendsZone {
    private String name;
    private String icon;
    private String content;

//getter和setter...

}</code></pre>

JS 支持類

這個類用于和JS進行交互.

/**

  • Created by Lulu on 2016/10/27.
  • JS支持類 */ public class JsSupport { private Context mContext; private String json;

    public JsSupport(Context context) {

     mContext = context;
    

    } public void setJson(String json) {

     this.json = json;
    

    }

    @JavascriptInterface public String getJson(){

     return json;
    

    }

    @JavascriptInterface public void showToast(String str) {

     Toast.makeText(mContext, str, Toast.LENGTH_SHORT).show();
    

    } }</code></pre> <p>@JavascriptInterface這個注解說明,該方法可以在js中調用.</p>

    上述代碼中的兩個方法, 在后面的Js可以通過window調用.

    這個兩個方法剛好能夠演示了, Java向JS傳遞數據和JS回傳數據給Java代碼

    WebView的準備

    WebView的使用有很多需要注意的地方, 咱們分步來說:

    step1: 在Activity中初始化WebView

    mWebView = (WebView) findViewById(R.id.main_web_view);
    //解決點擊鏈接跳轉瀏覽器問題
    mWebView.setWebViewClient(new WebViewClient());
    //js支持
    WebSettings settings = mWebView.getSettings();
    settings.setJavaScriptEnabled(true);
    //允許訪問assets目錄
    settings.setAllowFileAccess(true);
    //設置WebView排版算法, 實現單列顯示, 不允許橫向移動
    settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
    //assets文件路徑
    String path = "file:///android_asset/index.html";
    //添加Json數據
    addJson();
    //加載Html頁面
    mWebView.loadUrl(path);

    Note: assets文件的路徑大家先不用管 后面會說.

    上面的addJson()方法接下來會說

    step2: addJson()方法, 生成Json數據 傳給JsSupport類

    private void addJson() {
     JsSupport jsSupport = new JsSupport(this);
     List<FriendsZone> zones = new ArrayList<>();
     for (int i = 0; i < 100; i++) {
         zones.add(new FriendsZone("鹿鹿" + i, "images/icon.png", "這里是Html測試數據, 這里是Html測試數據, 這里是Html測試數據" + i));
     }
     Gson gson = new Gson();
     String json = gson.toJson(zones);
     Log.d(TAG, "addJson: json => " + json);
     jsSupport.setJson(json);
     //添加js交互接口, 并指明js中對象的調用名稱
     mWebView.addJavascriptInterface(jsSupport, "weichat");
    }

    Note: Json數據傳到JsSupport類之后, 內部會有一個getJson()方法可被js調用, 完成數據傳遞

    step3: 這一步算是一個小細節, 對于咱們的案例沒啥大用處. 就是當你的網頁跳轉后, 用戶按返回鍵會返回到上一個頁面而不是退出整個Activity

    重寫onBackPressed()方法

    @Override
    public void onBackPressed() {
     if (mWebView.canGoBack()) {
         mWebView.goBack();
     } else {
         super.onBackPressed();
     }
    }

    Html和js部分

    這個地方算是今天一個重點了, 接下來分步驟來說如何在Android工程中創建Html和js文件

    step1: 在src/main目錄下 創建 assets 文件夾, 在創建好的文件夾中創建index.html文件(名字隨意), 接著可以創建你想要的文件或文件夾, 如圖所示

    Paste_Image.png

    Note: js目錄下存放是jquery庫, 不要忘記添加.

    在這里就可以解釋webView中path = "file:///android_asset/index.html"; 這是固定代碼格式, 官方文檔中有寫

    step2: 完成index.html文件, 實現與Android系統數據交互

    <img id="head_background" src="images/background.jpg" />
    <script>
     var json = window.weichat.getJson();
     var infos = eval(json);
     for(var i = 0; i < infos.length; i++) {
         info = infos[i];
         var img = info.icon;
         var userName = info.name;
         var content = info.content;
         $("#head_background").after("<div ><div id='nav'><img src=" + img + " /></div><div id='info'><div id='userName'>" + userName + "</div><p id='content'>" + content + "</p></div></div>");
         $("#userName").click(
             function() {
                 var str = $(this).text();
                 window.weichat.showToast(str);
             }
         )
         $("#content").click(
             function() {
                 var str = $(this).text();
                 window.weichat.showToast(str);
             }
         )
     }
    </script>

    Note: 在這里我只列出了部分核心代碼, CSS樣式沒有放在上面.

    其實該文件中主要是用js來實現動態添加item 并且 給相應的item設置監聽...

    至此案例代碼梳理完畢.

    總結

    看到最后大家也許會想, 啥混合開發這不是so easy! 額..看上去是不難, 畢竟我這只是Demo, 簡單的數據傳遞. 希望能拋磚引玉, 得到大神的指導.

    來自:http://www.jianshu.com/p/0cc665503324

     

 本文由用戶 bn6102 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!