當(dāng)下主流 APP , Hybrid app 中需要熟練掌握的交互知識(shí)(二)

如果感覺略有用處地沮,點(diǎn)贊支持下作者。上一篇將關(guān)于 WebView 的設(shè)置仔細(xì)的捋了一遍瞧预,我們通過 WebViewController 這個(gè)類完成了所有 WebView 的設(shè)置谱净,并且在布局的時(shí)候,只需在布局文件中引入這個(gè)類的完整包名噪舀,前提是這個(gè)類要繼承于 WebView魁淳,就可以完成所有 WebView 的設(shè)置,具體可參考上一篇 當(dāng)下主流 APP与倡,Hybrid app 中需要熟練掌握的交互知識(shí)(一) 其實(shí)有人就說到了界逛,現(xiàn)在有現(xiàn)成的框架可,那我的出發(fā)點(diǎn)是從自己動(dòng)手開始纺座,再去接觸框架,這個(gè)系列我們一步步來息拜!

那么本篇將就以下幾點(diǎn)展開:

  • 頁面布局相同情況下Activity 的 共用問題。

  • 在原生與網(wǎng)頁混合的開發(fā)狀態(tài)下净响,如何確定頁面跳轉(zhuǎn)以及參數(shù)傳遞少欺。

  • 根據(jù)服務(wù)端發(fā)送的 Js 接口名去做具體實(shí)現(xiàn)

Activity 共用

這是當(dāng)下很多 WebApp 都在使用的一個(gè)套路,除了避免了創(chuàng)建多個(gè) Activity 后影響性能之外馋贤,還可以保持項(xiàng)目「友好」的結(jié)構(gòu)赞别!這樣的處理大多適應(yīng)于這樣的場(chǎng)景:

  • 頁面布局上方只有一個(gè) ToolBar 或者 ActionBar 等等的標(biāo)題欄

  • 下方則是一個(gè) WebView 用于呈現(xiàn)網(wǎng)頁內(nèi)容

  • 如此則可以將共同的屬性提取出來,WebView 則不用管配乓,都是一致的東西氯庆。ToolBar 上無論是標(biāo)題還是按鈕的設(shè)置,當(dāng)點(diǎn)擊了某處后我們會(huì)進(jìn)入我們?cè)诒镜貙?shí)現(xiàn)的網(wǎng)頁接口扰付,具體的原理請(qǐng)看下面的詳細(xì)解釋堤撵!

一 、建立共用的 Activity:

我們將之命名為 NewWebViewActivity

//獲取到消息處理類傳過來的 url 網(wǎng)址
String url = getIntent().getStringExtra("url");
//獲取到消息處理類傳過來的動(dòng)畫操作
int anim = getIntent().getIntExtra("animation", 0);
if (url == null) {
   finish();
}else if (url.equals(Constants.urlHostBase + Constants.urlLogIn)){
   baseWebView.loadUrl(url);
   topToolbar.setVisibility(View.GONE);
} else {
   baseWebView.loadUrl(url);
   //用動(dòng)畫文件判斷新開頁面
   if (anim == R.anim.slide_right_out) {  //當(dāng)所有的新開頁面 是從右往左打開時(shí)(表示新開頁面)
        //添加返回按鈕
        backImageView.setImageResource(R.drawable.returns);
        //變?yōu)轱@示狀態(tài)
        backImageView.setVisibility(View.VISIBLE);
        //返回鍵點(diǎn)擊事件
        backImageView.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               finish(); //關(guān)閉頁面
               //設(shè)置頁面退出動(dòng)畫為從左往右退出
               overridePendingTransition(R.anim.none, R.anim.slide_right_out);
           }
         });
    }
}

可以看到羽莺,并沒有多少邏輯实昨。我們這樣就可以所有新開的頁面添加一個(gè)返回鍵了,前提是有一個(gè)消息處理的類來完成打開頁面的 url 參數(shù)設(shè)置盐固,以及動(dòng)畫參數(shù)設(shè)置荒给,其實(shí)實(shí)現(xiàn)起來也是很簡(jiǎn)單!往下看

二 刁卜、建立共用的 Activity 的布局:

我們緊接著需要將我們這個(gè) Activity 布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_new_web_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:theme="@android:style/Animation.Toast"
    android:background="@android:color/white"
    tools:context="com.lansum.eip.activity.NewWebViewActivity">
    <!-- 標(biāo)題欄 -->
    <android.support.v7.widget.Toolbar
        android:id="@+id/web_top_toolbar"
        android:layout_width="match_parent"
        android:layout_height="70dp"
        android:layout_alignParentTop="true"
        android:background="#00a6ff"/>
    <!-- WebView -->
    <com.lansum.eip.webview.WebViewController
        android:id="@+id/base_web_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/web_top_toolbar" />
    <!-- 標(biāo)題欄右上角圖片點(diǎn)擊按鈕 默認(rèn)隱藏狀態(tài) 下同 -->
    <ImageView
        android:id="@+id/right_Button"
        android:layout_width="32dp"
        android:layout_height="32dp"
        android:layout_alignRight="@id/web_top_toolbar"
        android:layout_alignTop="@id/web_top_toolbar"
        android:layout_marginRight="16dp"
        android:layout_marginTop="30dp"
        android:visibility="gone" />
    <!-- 標(biāo)題欄正中顯示的標(biāo)題 根據(jù)點(diǎn)擊區(qū)域切換標(biāo)題內(nèi)容 -->
    <TextView
        android:id="@+id/toolbar_text_top"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@id/web_top_toolbar"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="32dp"
        android:textColor="@android:color/white"
        android:textSize="18sp" />
    <!-- 標(biāo)題欄左上角用于關(guān)閉打來頁面的圖片按鈕 -->
    <ImageView
        android:id="@+id/back_web"
        android:layout_width="32dp"
        android:layout_height="32dp"
        android:layout_alignLeft="@id/web_top_toolbar"
        android:layout_alignTop="@id/web_top_toolbar"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="30dp"
        android:visibility="gone" />
    <!-- 右上角文字點(diǎn)擊按鈕 -->
    <TextView
        android:id="@+id/right_Button_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignRight="@id/web_top_toolbar"
        android:layout_alignTop="@id/web_top_toolbar"
        android:layout_marginRight="16dp"
        android:layout_marginTop="32dp"
        android:textColor="@android:color/white"
        android:textSize="18sp"
        android:visibility="gone" />
</RelativeLayout>

布局文件很簡(jiǎn)單志电,我們將標(biāo)題欄上正中標(biāo)題,左上角關(guān)閉頁面的圖片點(diǎn)擊按鈕蛔趴,右上角的文字提交按鈕以及圖片點(diǎn)擊按鈕都放在了布局中挑辆,那接下來就是如何去控制他們的顯示時(shí)機(jī),以及按下后的反饋了!

建立好了這個(gè)用于展示我們所有網(wǎng)頁的共用 Activity 后鱼蝉,就是我們本篇的核心類了洒嗤,敲黑板!魁亦!

核心類 HtmlMessageForLocal

在開始之前我們先將思路捋清楚

  • 處理所有網(wǎng)頁的接口實(shí)現(xiàn)渔隶,以及跳轉(zhuǎn)操作和添加標(biāo)題欄上的按鈕添加。

  • 此類用于接收我們點(diǎn)擊或打開 WebView 服務(wù)端暴漏給我們的接口洁奈,我們負(fù)責(zé)具體實(shí)現(xiàn)间唉!

  • 將我們實(shí)現(xiàn)的方法上加上 @JavascriptInterface 注解

  • 此注解表明所有服務(wù)端 Js 接口,都會(huì)進(jìn)入我們自定義的這個(gè)方法里找同名方法利术,直接執(zhí)行里面的邏輯终吼!

好了,通過以上說明相信明眼的你可以發(fā)現(xiàn)氯哮,這是一個(gè)網(wǎng)頁與我們本地的交互的核心類,所有的交互邏輯實(shí)現(xiàn)都需要在這里進(jìn)行商佛!

接下來我們分層進(jìn)行喉钢,一層層,一個(gè)個(gè)方法的具體實(shí)現(xiàn)步驟良姆,來剖析整個(gè)過程肠虽。

一 、判斷接口名執(zhí)行具體的方法:

@JavascriptInterface
public void callHandler(final String methodName, final String data, final String callbackName) {
    Log.e(TAG, "Method:" + methodName);
    if (methodName.equals("openAttendanceFromJS")) {
       openAttendanceFromJS(data);      // 打開新窗口
    }
}

這里只是起到了判斷作用玛追,特定的方法執(zhí)行特定的操作税课,就比如上面這個(gè)方法,只負(fù)責(zé)用戶點(diǎn)擊了 WebView 去打開新的 WebView 的所有操作痊剖。

如何判斷

/**
 * Js 與 Native(android 原生交互)
 * Native 調(diào)用 JS 方法
 * @param methodName Js 方法名
 * @param data 需要用到的數(shù)據(jù) 比如圖片資源需要傳遞的數(shù)據(jù) 以下代碼的實(shí)體類為 RightInfo
 我們需要聲明一個(gè)實(shí)體類 用到什么數(shù)據(jù)資源就傳給這個(gè)參數(shù) 
 * @param callbackName 回調(diào)的方法名 這里具體用不到
 */
@JavascriptInterface
public void callHandler(final String methodName, final String data, final String callbackName) {
    Log.e(TAG, "Method:" + methodName);
    if (methodName.equals("openAttendanceFromJS")) {
       openAttendanceFromJS(data);      // 打開新窗口
    } else if (methodName.equals("addRightBarButtonItemFromJS")) {
       addRightBarButtonItemFromJS(data);// 添加右上角按鈕
    }

/**
 * 打開新窗口
 * @param url
 */
protected void openAttendanceFromJS(String url) {
    Log.i("js", url);
    // TODO Auto-generated method stub
    Intent intent = new Intent(ActivityCollector.getTopActivity(), NewWebViewActivity.class);
    intent.putExtra("url", url);
    intent.putExtra("animation", R.anim.slide_right_out);
    intent.putExtra("animation", R.anim.slide_right_in);
    ActivityCollector.getTopActivity().startActivity(intent);
}

/**
 * 設(shè)置右上角圖片按鈕
 * @param data
 */
protected void addRightBarButtonItemFromJS(String data) {
    topRightImage.setBackgroundResource(imageId);  //找到圖片按鈕資源
    topRightImage.setVisibility(View.VISIBLE);     //設(shè)置為可見狀態(tài)
    topRightImage.setOnClickListener(new View.OnClickListener() {  //此按鈕點(diǎn)擊事件
        @Override
        public void onClick(View v) {
            Activity activity = ActivityCollector.getTopActivity();//獲取到棧頂 Activity
            activity.runOnUiThread(new Runnable() {  //強(qiáng)制運(yùn)行到主線程
                @Override
                public void run() {
                    //找到共用打的 WebView                       
                    ActivityCollector.getTopActivity().findViewById(R.id.base_web_view);
                    activity.overridePendingTransition(R.anim.push_bottom_out, R.anim.push_bottom_in);
                    //找到對(duì)應(yīng) web url網(wǎng)址
                    baseWebView.loadUrl("javascript:" + rightInfo.funcName);
                }
            });
        }
    });
}

在這里用兩個(gè)方法舉例韩玩,重要的步驟在這里都呈現(xiàn)了出來,根據(jù)我們服務(wù)端和 Android 端的需求做相應(yīng)邏輯和方法的疊加就可以了陆馁!

總結(jié)

此次在這里將 Js 與 Native 的交互做了一個(gè)簡(jiǎn)單總結(jié)記錄找颓,整理了通用流程和思想,下個(gè)系列將使用當(dāng)下比較流行的 Hybrid APP 框架來實(shí)現(xiàn)一個(gè)總體的處理流程叮贩。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末击狮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子益老,更是在濱河造成了極大的恐慌彪蓬,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捺萌,死亡現(xiàn)場(chǎng)離奇詭異档冬,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門捣郊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辽狈,“玉大人,你說我怎么就攤上這事呛牲」蚊龋” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵娘扩,是天一觀的道長(zhǎng)着茸。 經(jīng)常有香客問我,道長(zhǎng)琐旁,這世上最難降的妖魔是什么涮阔? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮灰殴,結(jié)果婚禮上敬特,老公的妹妹穿的比我還像新娘。我一直安慰自己牺陶,他們只是感情好伟阔,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著掰伸,像睡著了一般皱炉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上狮鸭,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天合搅,我揣著相機(jī)與錄音,去河邊找鬼歧蕉。 笑死灾部,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的惯退。 我是一名探鬼主播梳猪,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蒸痹!你這毒婦竟也來了春弥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤叠荠,失蹤者是張志新(化名)和其女友劉穎匿沛,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體榛鼎,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逃呼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年鳖孤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抡笼。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡苏揣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出推姻,到底是詐尸還是另有隱情平匈,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布藏古,位于F島的核電站增炭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏隙姿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一厂捞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧靡馁,春花似錦欲鹏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吞加。三九已至裙犹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間衔憨,已是汗流浹背叶圃。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留践图,地道東北人掺冠。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像码党,于是被迫代替她去往敵國和親德崭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,515評(píng)論 25 707
  • 2014年10月29日揖盘,萬維網(wǎng)聯(lián)盟宣布眉厨,經(jīng)過接近8年的艱苦努力,該標(biāo)準(zhǔn)(HTML5)規(guī)范終于制定完成兽狭。接著憾股,整個(gè)移...
    smartbeng閱讀 2,360評(píng)論 0 20
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程鹿蜀,因...
    小菜c閱讀 6,358評(píng)論 0 17
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件服球、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,029評(píng)論 4 62
  • 對(duì)不起斩熊,我只是個(gè)小孩往枣,我只想做個(gè)健康,快樂的孩子座享。 不想接受歧視的眼光與朋友的嘲笑婉商。 希望你能給我多點(diǎn)溫暖,像太陽...
    王冊(cè)3閱讀 663評(píng)論 2 1