我只是一个星期前学习Android的人,对某些人来说可能是微不足道的,但这对我来说很重要,因为我是新手。我搜索了很多,无法找到一个直截了当的问题或解决方案。所以,我不想花太多时间在混淆和发布我的问题。
我的应用程序中有一个webview,它会加载一个网页。我在webview下面放了一个“Generate”按钮,并在该按钮的onclick中调用该网页中的JS函数“saveData()”。此功能需要几秒钟才能执行,并根据用户的网络连接速度返回响应。然后,我显示“复制”按钮来复制返回值。
generate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
generate.setVisibility(View.GONE);
copy.setVisibility(View.VISIBLE);
webView.loadUrl("javascript:alert(saveData)"); // this function needs few seconds.
}
});
我正在捕获JS函数的返回值,如下所示,并设置字符串“JsVal”的值
String JsVal;
public String getJsVal() {
return jsVal;
}
public void setJsVal(String jsVal) {
this.jsVal = jsVal;
}
webView.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onJsAlert(WebView view, String url, String message,JsResult result) {
Log.d("LogTag from js call method", message);
setJsVal(message);
result.confirm();
return true;
}
});
此处,复制按钮代码正在将文本复制以粘贴到某处,
copy.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(), " Copied", Toast.LENGTH_SHORT).show();
pb.setVisibility(View.GONE);
ClipboardManager myClipboard;
myClipboard = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE);
ClipData myClip;
myClip = ClipData.newPlainText("text", tVal);
myClipboard.setPrimaryClip(myClip);
}
});
问题是,如果我点击生成按钮,立即可以使用复制按钮。如果我立即点击复制按钮并粘贴到笔记应用程序中,则显示为null。如果我在2-3次之后复制它的非空。
我希望在JS返回值分配给String变量“JsVal”之后显示复制按钮,直到我不需要显示任何内容。
如何做到这一点,
答案 0 :(得分:1)
尝试以下方法:
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
copy.setVisibility(View.VISIBLE);
}
});
generate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
generate.setVisibility(View.GONE);
webView.loadUrl("javascript:alert(saveData)"); // this function needs few seconds.
}
});
答案 1 :(得分:0)
您需要通过WebViewClient扩展onPageFinished方法:
webView.setWebViewClient(new WebViewClient()
{
@Override
public void onPageFinished(WebView view, String url) {
// Enable button
}
});
答案 2 :(得分:0)
试试这个
webView.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onJsAlert(WebView view, String url, String message,JsResult result) {
Log.d("LogTag from js call method", message);
setJsVal(message);
result.confirm();
return true;
}
@Override
public void onProgressChanged(WebView view, int progress) {
if (progress == 100) {
generate.setVisibility(View.GONE);
copy.setVisibility(View.VISIBLE);
}
}
});
答案 3 :(得分:0)
你应该在按钮的onClick上使用AsyncTask。
您可以查看此文档https://developer.android.com/reference/android/os/AsyncTask.html
按如下方式更改您的代码,
generate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
generate.setVisibility(View.GONE);
//copy.setVisibility(View.VISIBLE);
webView.loadUrl("javascript:alert(saveData)"); // this function needs few seconds.
AsyncTaskRunner runner = new AsyncTaskRunner();
runner.execute();
}
});
此外,您需要添加以下代码以使AsyncTask正常工作。
private class AsyncTaskRunner extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... params) {
try {
if (getVal() == null) {
doInBackground(params);
}
} catch (Exception e) {
e.printStackTrace();
}
return "success";
}
@Override
protected void onPostExecute(String result) {
copy.setVisibility(View.VISIBLE);
}
@Override
protected void onPreExecute() {
}
@Override
protected void onProgressUpdate(String... text) {
}
}
这是您需要实施的解决方案,它应该按预期工作。