【问题标题】:Passing array from js to android将数组从js传递到android
【发布时间】:2015-07-06 23:00:46
【问题描述】:

您好,我有这个活动代码:

public class WebActivity extends ActionBarActivity {

    TextView number;

    WebView mWebView;
    CountDownTimer mTimer;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web);


        number = (TextView) findViewById(R.id.number);
        mTimer=new CountDownTimer(10000, 1000) {
            String[] myArray={"javascript:document.getElementById(\"utente\").value=\""+LoginActivity.username+"\"; document.getElementById(\"j_password\").value=\""+LoginActivity.password+"\"; document.querySelector(\"input[type=submit]\").click();","javascript:document.getElementById(\"menu-servizialunno:_idJsp14\").click();"};


            int currentIndex=0;
            public void onTick(long millisUntilFinished) {

                number.setText("seconds remaining: " + millisUntilFinished / 1000 + " " + (currentIndex + 1) + "/" + (myArray.length + 1));
            }
            //code comment start
            // i think this part could be written better
            // but it works!!
            public void onFinish() {
                if (currentIndex<myArray.length) {
                    number.setText("done!");
                    mWebView.loadUrl(myArray[currentIndex]);
                    currentIndex++;
                    mTimer.start();
                } else{
                    mTimer.cancel();

                }

            }
            //code comment end
        };

        mTimer.start();
        mWebView = (WebView) findViewById(R.id.webview);
        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.setWebViewClient(new WebSliderWebViewClient() {
            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(mWebView, url);
                Toast.makeText(getApplicationContext(), "Done!", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                Toast.makeText(getApplicationContext(), "Oh no! " + description, Toast.LENGTH_SHORT).show();

            }
        });
        mWebView.loadUrl("http://www.ss16374.scuolanext.info");



    }

还有这个js函数:

function voti( showSubject, showData, showVote ){
    var votitotali = []
    document.getElementById("menu-servizialunno:_idJsp14").click();
    setTimeout(function(){
        elems = document.querySelectorAll("td, legend");
        for(var i = 0; i < elems.length; i++){
            curText = elems[i].innerHTML;
            if( elems[i].tagName == "LEGEND" && showSubject ){
                votitotali += [curText]
                //console.log( curText );
            }else if( elems[i].innerHTML.indexOf("Voto") != -1 && showVote ){
                votitotali += [curText.replace(/.*\(([0-9\.]+)\)/,"$1")]
                //console.log( curText.replace(/.*\(([0-9\.]+)\)/,"$1") );
            }else if( /\d{2}\/\d{2}\/\d{4}/.test(elems[i].innerHTML) && showData ){
                votitotali += [curText.replace(/.*(\d{2}\/\d{2}\/\d{4}).*/,"$1")]
                //console.log( curText.replace(/.*(\d{2}\/\d{2}\/\d{4}).*/,"$1") );
            }
        }
        document.getElementsByClassName("btl-modal-closeButton")[0].click()
    },3000);
    return votitotali
}

我可以将votitotali 数组存储在我的Android 应用程序中吗?因为我需要从一个站点获取一些信息,并且我必须在应用程序中的 textView 上打印它们,但我真的不知道如何使用 webview 来做到这一点......

【问题讨论】:

  • 但是...我不能用那个,因为我需要用webview来实现那个功能,这个功能必须使用android webview来获取信息

标签: javascript android arrays android-webview


【解决方案1】:

这其实很简单。您需要注入一个 Java 对象,该对象具有接收数组的方法:

class MyReceiver {
    @JavascriptInterface
    public void receive(String[] input) {
        // input is your data!
    }
}

// At the very beginning
mWebView.addJavascriptInterface(new MyReceiver(), "receiver");
// ...

如果你在 JavaScript 代码中这样称呼它:

receiver.receive(voti( ... ));

您将在MyReceiver.receive 中获得数组。

请注意,非字符串数组元素(例如数字)不会转换为字符串,而是替换为nulls。

【讨论】:

  • 所以我只需要输入 mwevview.loadUrl("javascript:voti(showSubject, showData, showVote){...}");然后调用receiver.receiver(voti(1, 1, 1));??
  • 这是我做的,我在mTimer中调用了javascript函数...alessio.ragno.info/android.txt
  • mWebView.loadUrl("receiver.receive(voti(1,1,1));"); 应该变成 mWebView.loadUrl("javascript:receiver.receive(voti(1,1,1));");
  • 如何使用该类/函数之外的输入数组?我尝试将其设为全局变量,但它不起作用......如果可能的话,我还需要在另一个活动中使用它......
  • 请注意,注入方法的代码在不同的线程上运行(请参阅 WebView.html.addJavascriptInterface docs),因此如果您打算将其设为全局变量,则需要使用同步。此外,请参阅此问题以了解跨活动共享数据的可能方式:stackoverflow.com/questions/1944656/android-global-variable
猜你喜欢
  • 2016-11-05
  • 1970-01-01
  • 2020-06-15
  • 1970-01-01
  • 2018-09-25
  • 2022-07-15
  • 1970-01-01
  • 2023-03-27
  • 2018-02-02
相关资源
最近更新 更多