根据从 JavaScript 接口传递的参数启动一个 Activity
Start an Activity based on parameter passed from JavaScript interface
我想在 WebView
中点击 link 时打开一个新的 activity,但我不知道如何创建一个传递 [=16] 的方法=] 变量来创建动态方法。这就是为什么我实际上这样做的原因:
public class WebAppInterface {
public Context mContext;
WebAppInterface(Context c) {
mContext = c;
}
@JavascriptInterface
public void toAbout(){
startActivity(new Intent(MainActivity.this, About.class));
}
@JavascriptInterface
public void toTwitch(){
startActivity(new Intent(MainActivity.this, Twitch.class));
}
@JavascriptInterface
public void toNews(){
startActivity(new Intent(MainActivity.this, News.class));
}
(much more methods like these for specific classes) ...
}
HTML/JS:
<div class="entry" onclick="toTwitch();">Twitch</div>
<div class="entry" onclick="toAbout();">About</div>
<script type="text/javascript">
function toTwitch() {
Android.toTwitch();
}
function toAbout(input) {
Android.toAbout();
}
</script>
MainActivity.java onCreate
:
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView myWebView = (WebView) findViewById(R.id.webView1);
myWebView.addJavascriptInterface(new WebAppInterface(this), "Android");
myWebView.setWebViewClient(new WebViewClient());
myWebView.getSettings().setJavaScriptEnabled(true);
myWebView.loadUrl("file:///android_asset/index.html");
// Caching
myWebView.getSettings().setDomStorageEnabled(true);
String appCachePath = getApplicationContext().getCacheDir().getAbsolutePath();
myWebView.getSettings().setAppCachePath(appCachePath);
myWebView.getSettings().setAllowFileAccess(true);
myWebView.getSettings().setAppCacheEnabled(true);
}
有没有办法只做一个方法而不是几十个(toAbout()
、toTwitch
、toNews()
等)更多动态?
Android JavaScript接口支持参数传递
您可以创建一个接受 String
的通用方法,获取相应的 Class
并在 startActivity()
上使用它。请注意,您必须使用 Activity
的 完全限定名称 ,这意味着包括包名称(例如 com.example.About
)。
里面 WebAppInterface
,
@JavascriptInterface
public void openActivity(String activityName) {
String packageName = "com.example";
try {
Class activityClass = Class.forName(packageName + "." + activityName);
mContext.startActivity(new Intent(MainActivity.this, activityClass));
} catch(Exception ex) {
Toast.makeText(mContext, "invalid activity name: " + activityName, Toast.LENGTH_SHORT).show();
}
}
在 HTML/JS,
<script type="text/javascript">
function toTwitch() {
Android.openActivity('Twitch');
}
function toAbout() {
Android.openActivity('About');
}
</script>
嗯,这是一个关于 WebView
如何与本机应用交互的问题。好的,我在这里详细解释一下,以防其他人运行遇到同样的问题。
首先,创建一个与当前 Activity
交互的内部 class,如下所示:
private final class JsReturnHomeObj {
JsReturnHomeObj() {
}
public void returnHomeOnClick() {
new Handler(getMainLooper()).post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
Intent intent = new Intent(PayWapActivity.this,
HomeActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
});
}
}
第二个,设置你的WebView
支持此JavaScript
操作:
webview = (WebView) findViewById(R.id.activity_pay_wap_webview);
WebSettings settings = webview.getSettings();
settings.setJavaScriptEnabled(true);
webview.addJavascriptInterface(new JsReturnHomeObj(), "js_return_home");
最后,通过JavaScript
调用此方法:
<script type="text/javascript">
function toTwitch() {
js_return_home.returnHomeOnClick();
}
</script>
希望对您有所启发。
我想在 WebView
中点击 link 时打开一个新的 activity,但我不知道如何创建一个传递 [=16] 的方法=] 变量来创建动态方法。这就是为什么我实际上这样做的原因:
public class WebAppInterface {
public Context mContext;
WebAppInterface(Context c) {
mContext = c;
}
@JavascriptInterface
public void toAbout(){
startActivity(new Intent(MainActivity.this, About.class));
}
@JavascriptInterface
public void toTwitch(){
startActivity(new Intent(MainActivity.this, Twitch.class));
}
@JavascriptInterface
public void toNews(){
startActivity(new Intent(MainActivity.this, News.class));
}
(much more methods like these for specific classes) ...
}
HTML/JS:
<div class="entry" onclick="toTwitch();">Twitch</div>
<div class="entry" onclick="toAbout();">About</div>
<script type="text/javascript">
function toTwitch() {
Android.toTwitch();
}
function toAbout(input) {
Android.toAbout();
}
</script>
MainActivity.java onCreate
:
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView myWebView = (WebView) findViewById(R.id.webView1);
myWebView.addJavascriptInterface(new WebAppInterface(this), "Android");
myWebView.setWebViewClient(new WebViewClient());
myWebView.getSettings().setJavaScriptEnabled(true);
myWebView.loadUrl("file:///android_asset/index.html");
// Caching
myWebView.getSettings().setDomStorageEnabled(true);
String appCachePath = getApplicationContext().getCacheDir().getAbsolutePath();
myWebView.getSettings().setAppCachePath(appCachePath);
myWebView.getSettings().setAllowFileAccess(true);
myWebView.getSettings().setAppCacheEnabled(true);
}
有没有办法只做一个方法而不是几十个(toAbout()
、toTwitch
、toNews()
等)更多动态?
Android JavaScript接口支持参数传递
您可以创建一个接受 String
的通用方法,获取相应的 Class
并在 startActivity()
上使用它。请注意,您必须使用 Activity
的 完全限定名称 ,这意味着包括包名称(例如 com.example.About
)。
里面 WebAppInterface
,
@JavascriptInterface
public void openActivity(String activityName) {
String packageName = "com.example";
try {
Class activityClass = Class.forName(packageName + "." + activityName);
mContext.startActivity(new Intent(MainActivity.this, activityClass));
} catch(Exception ex) {
Toast.makeText(mContext, "invalid activity name: " + activityName, Toast.LENGTH_SHORT).show();
}
}
在 HTML/JS,
<script type="text/javascript">
function toTwitch() {
Android.openActivity('Twitch');
}
function toAbout() {
Android.openActivity('About');
}
</script>
嗯,这是一个关于 WebView
如何与本机应用交互的问题。好的,我在这里详细解释一下,以防其他人运行遇到同样的问题。
首先,创建一个与当前 Activity
交互的内部 class,如下所示:
private final class JsReturnHomeObj {
JsReturnHomeObj() {
}
public void returnHomeOnClick() {
new Handler(getMainLooper()).post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
Intent intent = new Intent(PayWapActivity.this,
HomeActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
});
}
}
第二个,设置你的WebView
支持此JavaScript
操作:
webview = (WebView) findViewById(R.id.activity_pay_wap_webview);
WebSettings settings = webview.getSettings();
settings.setJavaScriptEnabled(true);
webview.addJavascriptInterface(new JsReturnHomeObj(), "js_return_home");
最后,通过JavaScript
调用此方法:
<script type="text/javascript">
function toTwitch() {
js_return_home.returnHomeOnClick();
}
</script>
希望对您有所启发。