根据从JavaScript接口传递的参数启动Activity

时间:2015-05-18 09:57:45

标签: android android-activity android-webview

我想在点击WebView中的链接时打开一项新活动,但我不知道如何创建传递Object变量的方法来制作动态方法。这就是为什么我这样做的原因:

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()toTwitchtoNews()等)更具动态性吗?

2 个答案:

答案 0 :(得分:2)

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>

答案 1 :(得分:0)

嗯,这是关于WebView如何与原生应用互动的问题。好的,我在这里详细解释,以防其他人遇到同样的问题。

首先,创建一个与当前Activity交互的内部类:

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>

我希望你受到启发。