天天看點

android 和h5互動,Android中與H5的互動

Android日常開發中,常常會遇到加載H5頁面的情況,于是少不了與H5頁面的互動問題。具體表現在Android調用H5代碼及H5中調用Android代碼兩種情況。

測試頁面

android 和h5互動,Android中與H5的互動

test.png

這裡我們首先編寫上圖所示的測試頁面,在MainActivity中初始化各元件

private void initView() {

mLoginLayout = findViewById(R.id.login_layout);

mUserName = findViewById(R.id.edit_user_name);

mPassword = findViewById(R.id.edit_password);

mWebView = findViewById(R.id.web_view);

}

Android調用H5

要點:

WebView.loadUrl("javascript:method(" + "'" + param+ "'" + ")");

Android調用H5時,首先建立WebView頁面,初始化完成後,調用loadUrl方法,其參數有固定格式,以“javascript:”開頭,表示調用javasript代碼,後面接在H5中自己定義的method方法,如有參數須像上面那樣前後再用單引号括起來。

初始化WebView

private void initWebView() {

WebSettings settings = mWebView.getSettings();

// 設定啟用JavaScript功能

settings.setJavaScriptEnabled(true);

mWebView.setWebViewClient(new WebViewClient());

mWebView.loadUrl("file:///android_asset/index.html");

}

将已經寫好的index.html檔案放在assets目錄下,通過loadUrl方法加載進來。

點選登入跳轉到H5頁面,并在H5頁面中顯示輸入的使用者名。

public void login(View view) {

String userName = mUserName.getText().toString().trim();

String password = mPassword.getText().toString().trim();

login(userName, password);

}

private void login(String userName, String password) {

if(!TextUtils.isEmpty(password) && TextUtils.equals("123456", password)) {

mWebView.loadUrl("javascript:login(" + "'" + userName + "'" + ")");

mWebView.setVisibility(View.VISIBLE);

mLoginLayout.setVisibility(View.GONE);

} else {

Toast.makeText(this, "密碼輸出錯誤", Toast.LENGTH_SHORT).show();

}

}

效果如下:

android 和h5互動,Android中與H5的互動

H5.png

H5調用Android

要點:

Android中:WebView調用addaddJavascriptInterface方法,JsInterface為H5回調類,自定義名稱,tag與H5中js代碼window後的tag名稱一緻即可。JsInterface中回到方法method()記得添加@JavascriptInterface标記。

WebView.addJavascriptInterface(new JsInterface(), tag);

private class JsInterface {

@JavascriptInterface

public void method() {

}

}

H5中:onclick()方法中使用window開頭,表示調用Android方法,tag與前面保持一緻,method為Android中的回調方法,可傳參。

登出

完整代碼

MainActivity:

public class MainActivity extends AppCompatActivity {

private View mLoginLayout;

private TextView mUserName;

private TextView mPassword;

private WebView mWebView;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

initView();

initWebView();

}

private void initView() {

mLoginLayout = findViewById(R.id.login_layout);

mUserName = findViewById(R.id.edit_user_name);

mPassword = findViewById(R.id.edit_password);

mWebView = findViewById(R.id.web_view);

}

private void initWebView() {

WebSettings settings = mWebView.getSettings();

// 設定啟用JavaScript功能

settings.setJavaScriptEnabled(true);

mWebView.setWebViewClient(new WebViewClient());

mWebView.addJavascriptInterface(new JsLogoutInterface(), "android");

mWebView.loadUrl("file:///android_asset/index.html");

}

public void login(View view) {

String userName = mUserName.getText().toString().trim();

String password = mPassword.getText().toString().trim();

login(userName, password);

}

private void login(String userName, String password) {

if(!TextUtils.isEmpty(password) && TextUtils.equals("123456", password)) {

mWebView.loadUrl("javascript:login(" + "'" + userName + "'" + ")");

mWebView.setVisibility(View.VISIBLE);

mLoginLayout.setVisibility(View.GONE);

} else {

Toast.makeText(this, "密碼輸出錯誤", Toast.LENGTH_SHORT).show();

}

}

private class JsLogoutInterface {

@JavascriptInterface

public void logout() {

Toast.makeText(MainActivity.this, "退出成功", Toast.LENGTH_SHORT).show();

runOnUiThread(new Runnable() {

@Override

public void run() {

mWebView.setVisibility(View.GONE);

mLoginLayout.setVisibility(View.VISIBLE);

}

});

}

}

}

布局檔案activity_main.xml:

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:gravity="center"

tools:context=".MainActivity">

android:id="@+id/login_layout"

android:layout_width="wrap_content"

android:layout_height="wrap_content">

android:id="@+id/user_name"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginTop="15dp"

android:text="使用者名:"

android:textSize="16sp"

android:textColor="@android:color/black"

/>

android:id="@+id/edit_user_name"

android:layout_width="80dp"

android:layout_height="wrap_content"

android:layout_alignBottom="@+id/user_name"

android:layout_toRightOf="@+id/user_name"

android:layout_marginBottom="-8dp"

/>

android:id="@+id/password"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignRight="@+id/user_name"

android:layout_below="@+id/user_name"

android:layout_marginTop="15dp"

android:text="密碼:"

android:textSize="16sp"

android:textColor="@android:color/black"

/>

android:id="@+id/edit_password"

android:layout_width="80dp"

android:layout_height="wrap_content"

android:layout_alignBottom="@+id/password"

android:layout_toRightOf="@+id/password"

android:layout_marginBottom="-8dp"

/>

android:id="@+id/login_button"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_below="@+id/password"

android:layout_marginTop="20dp"

android:layout_marginLeft="30dp"

android:text="登入"

android:onClick="login"

/>

android:id="@+id/web_view"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:visibility="gone"

/>

index.html:

Home

#user {

font-size: 20px;

color: red

}

function login(userName) {

document.getElementById("user").innerHTML = userName;

}

目前使用者為:

登出