我正在尝试在下载任务执行时禁用一个按钮。我已经尝试使用setEnabled、setVisibility和setClickable方法,以及它们的各种组合。所有这些方法都可以在任务执行时禁用按钮的点击事件,但是事件仍然会以某种方式被注册,并且当我重新激活按钮时,如果我在按钮被禁用时点击它,处理程序将被调用...即使它是不可见或"消失"的!(我不确定是否称之为处理程序,我想引用onClick方法)。
我还插入了一个计数器和一个Log来验证上面所说的情况。下面的代码段
完整的项目(非常简单,只是一个培训示例)可在我刚创建的存储库中测试。
总之,从我所读到的来看,确实存在关于禁用按钮的问题。通常情况下,这是通过使用标志来调用onClick方法仅当标志为true时才解决的。虽然,这并不能解决重新启用按钮的问题。我也尝试过
有没有简单的解决方案?任何想法?我错过了一些基本细节吗?如果不是,我考虑尝试通过编程方式创建一个新的按钮来解决这个问题。如果我不保留旧按钮的引用,它们会通过垃圾回收被删除吗?
提前致谢!
[编辑]澄清:
由于标题可能在这一点上具有误导性,我想澄清一下,即我能够禁用和重新启用按钮,所有功能都很好,除了当按钮被禁用时。请注意,我添加了
我还插入了一个计数器和一个Log来验证上面所说的情况。下面的代码段
if(counter>1) return;
用于停止崩溃,但我想删除它,因为我想重新启用按钮,而不是永久禁用它。
onClick:
public void downloadOnClick(View v) {
counter++;
Log.d(this.getLocalClassName(), "Button was clicked " + counter + " times.");
if(counter>1) return;
ConnectivityManager connMgr = (ConnectivityManager)
getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected()) {
//mButton.setVisibility(View.GONE);
mButton.setEnabled(false);
//mButton.setClickable(false);
mTextView.setText("Getting html file...");
// if we use simple http, we will need to handle redirect status code
new DownloadWebpageTask().execute("https://www.google.com/");
} else {
mTextView.setText("No network connection available.");
}
}
异步任务:
private class DownloadWebpageTask extends AsyncTask<String, Void, String> {
private HttpURLConnection mConnection;
@Override
protected String doInBackground(String... urls) {
try {
URL url = new URL(urls[0]);
mConnection = (HttpURLConnection) url.openConnection();
mConnection.setReadTimeout(10000 /* milliseconds */);
mConnection.setConnectTimeout(15000 /* milliseconds */);
mConnection.setRequestMethod("GET");
mConnection.setDoInput(true);
mConnection.connect();
int statusCode = mConnection.getResponseCode();
if (statusCode != HttpURLConnection.HTTP_OK) {
return "Error: Failed getting update notes";
}
return readTextFromServer(mConnection);
} catch (IOException e) {
return "Error: " + e.getMessage();
}
}
private String readTextFromServer(HttpURLConnection connection) throws IOException {
InputStreamReader stream = null;
try {
stream = new InputStreamReader(connection.getInputStream());
BufferedReader br = new BufferedReader(stream);
StringBuilder sb = new StringBuilder();
String line = br.readLine();
while (line != null) {
sb.append(line + "\n");
line = br.readLine();
}
return sb.toString();
} finally {
if (stream != null) {
stream.close();
}
}
}
@Override
protected void onPostExecute(String result) {
mTextView.setText(result);
// Can not reactivate button / cancel (pending?) events....
//mButton.setVisibility(View.VISIBLE);
mButton.setEnabled(true);
//mButton.setClickable(true);
}
}
完整的项目(非常简单,只是一个培训示例)可在我刚创建的存储库中测试。
总之,从我所读到的来看,确实存在关于禁用按钮的问题。通常情况下,这是通过使用标志来调用onClick方法仅当标志为true时才解决的。虽然,这并不能解决重新启用按钮的问题。我也尝试过
mButton.cancelPendingInputEvents();
但它不起作用(而且我不知道为什么。点击事件还没有注册吗?或者它们没有挂起?有没有简单的解决方案?任何想法?我错过了一些基本细节吗?如果不是,我考虑尝试通过编程方式创建一个新的按钮来解决这个问题。如果我不保留旧按钮的引用,它们会通过垃圾回收被删除吗?
提前致谢!
[编辑]澄清:
由于标题可能在这一点上具有误导性,我想澄清一下,即我能够禁用和重新启用按钮,所有功能都很好,除了当按钮被禁用时。请注意,我添加了
if(counter>1) return;
这行只是为了测试,但它停止了按钮按我所需的方式工作(这就是为什么我不使用标志。我不希望解决问题时出现这行!)日志足以告诉我,当我单击它被禁用的按钮时,方法正在被调用!