Android+Html5混合開(kāi)發(fā)仿微信朋友圈
開(kāi)發(fā)之前
大約從去年開(kāi)始吧, 也可能是前年 Html5好像火得不得了, 不得了...總能從網(wǎng)上聽(tīng)說(shuō)到 XXX混合開(kāi)發(fā), 為了緊跟潮流(雖然有點(diǎn)兒晚了), 咱們也看看Android+Html5混合開(kāi)發(fā)是怎樣的!
今天帶來(lái)的案例是微信的朋友圈, 因?yàn)槲矣X(jué)得是微信把H5給"捧紅了". 不過(guò)丑話說(shuō)在前頭, 咱們的仿朋友圈可是"低仿", 只是把混合開(kāi)發(fā)的大致流程說(shuō)說(shuō), 界面可能不堪入目...見(jiàn)諒..
開(kāi)發(fā)環(huán)境
Android Studio 2.2.2
JDK1.7
API 24
Gradle 2.2.2
jQuery v3.1.1
相關(guān)知識(shí)點(diǎn)
webView的使用
Json的解析和生成(本案例使用GSON)
Html和js基礎(chǔ)(為方便, 本案例使用了jQuery)
Java和js的交互
我覺(jué)得上述Android方面知識(shí)點(diǎn)對(duì)大家應(yīng)該不算困難. 在H5和js方面我了解的也不是特別深入, 會(huì)用用基本的就夠了。
開(kāi)始開(kāi)發(fā)
案例預(yù)覽
上面說(shuō)了, 請(qǐng)?jiān)徑缑娴牟豢叭肽?...

案例分析
說(shuō)混合開(kāi)發(fā), 其實(shí)就是在WebView上顯示本地的Html文件, 所以我們要解決的問(wèn)題就是如何將Java的數(shù)據(jù)傳送到Html文件中并且通過(guò)JS進(jìn)行動(dòng)態(tài)的顯示.
本案例的思路是, 在Activity中生成Json數(shù)據(jù)(這些Json數(shù)據(jù)都是假數(shù)據(jù), 在項(xiàng)目可以直接從網(wǎng)絡(luò)中獲取Json數(shù)據(jù)), Json數(shù)據(jù)通過(guò)與JS的交互, 在JS中接收到消息, 然后動(dòng)態(tài)生成Html的Item顯示在WebView上! 并且每個(gè)item都有相應(yīng)的點(diǎn)擊事件, 點(diǎn)擊后回調(diào)Android系統(tǒng)的Toast, 彈出當(dāng)前點(diǎn)擊內(nèi)容.
搭建布局
額..其實(shí)就是一個(gè)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>
實(shí)體類(lèi)準(zhǔn)備
本例中用于封裝json數(shù)據(jù)
public class FriendsZone {
private String name;
private String icon;
private String content;
//getter和setter...
}
JS 支持類(lèi)
這個(gè)類(lèi)用于和JS進(jìn)行交互.
/**
* Created by Lulu on 2016/10/27.
* JS支持類(lèi)
*/
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();
}
}
@JavascriptInterface這個(gè)注解說(shuō)明,該方法可以在js中調(diào)用.
上述代碼中的兩個(gè)方法, 在后面的Js可以通過(guò)window調(diào)用.
這個(gè)兩個(gè)方法剛好能夠演示了, Java向JS傳遞數(shù)據(jù)和JS回傳數(shù)據(jù)給Java代碼
WebView的準(zhǔn)備
WebView的使用有很多需要注意的地方, 咱們分步來(lái)說(shuō):
step1: 在Activity中初始化WebView
mWebView = (WebView) findViewById(R.id.main_web_view); //解決點(diǎn)擊鏈接跳轉(zhuǎn)瀏覽器問(wèn)題 mWebView.setWebViewClient(new WebViewClient()); //js支持 WebSettings settings = mWebView.getSettings(); settings.setJavaScriptEnabled(true); //允許訪問(wèn)assets目錄 settings.setAllowFileAccess(true); //設(shè)置WebView排版算法, 實(shí)現(xiàn)單列顯示, 不允許橫向移動(dòng) settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); //assets文件路徑 String path = "file:///android_asset/index.html"; //添加Json數(shù)據(jù) addJson(); //加載Html頁(yè)面 mWebView.loadUrl(path);
Note: assets文件的路徑大家先不用管 后面會(huì)說(shuō).
上面的addJson()方法接下來(lái)會(huì)說(shuō)
step2: addJson()方法, 生成Json數(shù)據(jù) 傳給JsSupport類(lèi)
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測(cè)試數(shù)據(jù), 這里是Html測(cè)試數(shù)據(jù), 這里是Html測(cè)試數(shù)據(jù)" + i));
}
Gson gson = new Gson();
String json = gson.toJson(zones);
Log.d(TAG, "addJson: json => " + json);
jsSupport.setJson(json);
//添加js交互接口, 并指明js中對(duì)象的調(diào)用名稱(chēng)
mWebView.addJavascriptInterface(jsSupport, "weichat");
}
Note: Json數(shù)據(jù)傳到JsSupport類(lèi)之后, 內(nèi)部會(huì)有一個(gè)getJson()方法可被js調(diào)用, 完成數(shù)據(jù)傳遞
step3: 這一步算是一個(gè)小細(xì)節(jié), 對(duì)于咱們的案例沒(méi)啥大用處. 就是當(dāng)你的網(wǎng)頁(yè)跳轉(zhuǎn)后, 用戶按返回鍵會(huì)返回到上一個(gè)頁(yè)面而不是退出整個(gè)Activity
重寫(xiě)onBackPressed()方法
@Override
public void onBackPressed() {
if (mWebView.canGoBack()) {
mWebView.goBack();
} else {
super.onBackPressed();
}
}
Html和js部分
這個(gè)地方算是今天一個(gè)重點(diǎn)了, 接下來(lái)分步驟來(lái)說(shuō)如何在Android工程中創(chuàng)建Html和js文件
step1: 在src/main目錄下 創(chuàng)建 assets 文件夾, 在創(chuàng)建好的文件夾中創(chuàng)建index.html文件(名字隨意), 接著可以創(chuàng)建你想要的文件或文件夾, 如圖所示

Note: js目錄下存放是jquery庫(kù), 不要忘記添加.
在這里就可以解釋webView中path = "file:///android_asset/index.html"; 這是固定代碼格式, 官方文檔中有寫(xiě)
step2: 完成index.html文件, 實(shí)現(xiàn)與Android系統(tǒng)數(shù)據(jù)交互
<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樣式?jīng)]有放在上面.
其實(shí)該文件中主要是用js來(lái)實(shí)現(xiàn)動(dòng)態(tài)添加item 并且 給相應(yīng)的item設(shè)置監(jiān)聽(tīng)...
至此案例代碼梳理完畢.
完整代碼
代碼已經(jīng)上傳到Github, 歡迎大家Clone.
總結(jié)
看到最后大家也許會(huì)想, 啥混合開(kāi)發(fā)這不是so easy! 額..看上去是不難, 畢竟我這只是Demo, 簡(jiǎn)單的數(shù)據(jù)傳遞. 希望能拋磚引玉, 得到大神的指導(dǎo). 歡迎大家對(duì)本文進(jìn)行指正和修改.
謝謝簡(jiǎn)書(shū)作者的分享。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android仿微信發(fā)朋友圈瀏覽圖片效果
- Android實(shí)現(xiàn)微信朋友圈發(fā)本地視頻功能
- Android 仿微信朋友圈點(diǎn)贊和評(píng)論彈出框功能
- Android自定義SwipeRefreshLayout高仿微信朋友圈下拉刷新
- Android 高仿微信朋友圈動(dòng)態(tài)支持雙擊手勢(shì)放大并滑動(dòng)查看圖片效果
- Android仿微信朋友圈圖片查看器
- Android仿微信朋友圈點(diǎn)擊加號(hào)添加圖片功能
- Android GridView仿微信朋友圈顯示圖片
- Android仿微信朋友圈點(diǎn)贊和評(píng)論功能
- Android實(shí)現(xiàn)微信朋友圈圖片和視頻播放
相關(guān)文章
eclipse搭建android開(kāi)發(fā)環(huán)境詳細(xì)步驟
本文主要介紹了eclipse搭建android開(kāi)發(fā)環(huán)境詳細(xì)步驟,具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-03-03
點(diǎn)九圖片的顯示內(nèi)容區(qū)域應(yīng)作何理解
.9 ,是andriod平臺(tái)的應(yīng)用軟件開(kāi)發(fā)里的一種特殊的圖片形式,文件擴(kuò)展名為:.9.png;點(diǎn)九圖片的拉伸區(qū)域不難理解,顯示內(nèi)容區(qū)域是怎樣的,接下來(lái)本文為您一一解答,感興趣的朋友可以了解下2013-01-01
Android App中使用Pull解析XML格式數(shù)據(jù)的使用示例
這篇文章主要介紹了Android App中使用Pull解析XML格式數(shù)據(jù)的使用示例,Pull是Android中自帶的XML解析器,Java里也是一樣用:D需要的朋友可以參考下2016-04-04
Android ListView滾動(dòng)到底后自動(dòng)加載數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了Android之ListView滾動(dòng)到底后自動(dòng)加載數(shù)據(jù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
Android實(shí)現(xiàn)動(dòng)態(tài)高斯模糊背景效果
在現(xiàn)代 Android UI 中,動(dòng)態(tài)高斯模糊背景 常見(jiàn)于對(duì)話框或彈窗后面的模糊遮罩,相比靜態(tài)模糊圖,動(dòng)態(tài)模糊可隨著內(nèi)容滾動(dòng)或變化實(shí)時(shí)更新,使界面更具層次感與沉浸感,所以本文給大家介紹了Android實(shí)現(xiàn)動(dòng)態(tài)高斯模糊背景效果,需要的朋友可以參考下2025-04-04
Android應(yīng)用中利用ViewPager實(shí)現(xiàn)多頁(yè)面滑動(dòng)切換效果示例
這篇文章主要介紹了Android應(yīng)用中利用ViewPager實(shí)現(xiàn)多頁(yè)面滑動(dòng)切換效果示例,配合了Fragment和PagerTabStrip,需要的朋友可以參考下2016-03-03
Android 圓角邊框的實(shí)現(xiàn)方式匯總
這篇文章主要介紹了Android 圓角邊框的實(shí)現(xiàn)方式匯總的相關(guān)資料,需要的朋友可以參考下2016-03-03
Android開(kāi)發(fā)之使用SQLite存儲(chǔ)數(shù)據(jù)的方法分析
這篇文章主要介紹了Android開(kāi)發(fā)之使用SQLite存儲(chǔ)數(shù)據(jù)的方法,結(jié)合實(shí)例形式分析了Android使用SQLite數(shù)據(jù)庫(kù)實(shí)現(xiàn)針對(duì)數(shù)據(jù)的增刪改查操作相關(guān)技巧,需要的朋友可以參考下2017-07-07
Android實(shí)現(xiàn)探探圖片滑動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)探探圖片滑動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06

