很抱歉,如果之前有人询问,但我找不到答案(我已搜索过了!)
我尝试按照google / android文档制作一个不确定的进度条,并在我的应用执行冗长的任务时旋转。
protected void readData(final String whatToFind)
{
try
{
if (whatToFind.length() == 0)
{
adapter.notifyDataSetChanged();
return;
}
mProgress.setVisibility(View.VISIBLE);
mProgressText.setVisibility(View.VISIBLE);
m_dialog = new ProgressDialog(this);
m_dialog.setTitle("Searching...");
m_dialog.setMessage("Please wait while searching...");
m_dialog.setIndeterminate(true);
m_dialog.setCancelable(true);
m_dialog.show();
new Thread(new Runnable()
{
public void run()
{
mHandler.post(new Runnable()
{
public void run()
{
while (LotsOfWorkGoingOn)
{
// Update the progress bar
mHandler.post(new Runnable() {
public void run() {
mProgress.setProgress(m_i); /// vain attempt to make the progressbar spin
}
});
mProgress.setVisibility(View.GONE);
mProgressText.setVisibility(View.GONE);
m_dialog.hide();
}
});
}
}).start();
}
catch (Exception ex)
{
Log.e(LOGid, "Error listing items:" + ex.getStackTrace());
}
答案 0 :(得分:9)
setProgress
仅在进度条不是Indeterminate时生效。
不确定意味着它没有进度金额,并且在您不知道完成任务所完成/剩余的进度量时使用它。
如documentation中所述:
进度条也可以是不确定的。在不确定模式下,进度条显示循环动画,但不显示进度。当任务的长度未知时,应用程序将使用此模式。不确定的进度条可以是旋转轮或水平杆。
另一方面,如果你甚至没有看到进度条,也许你的背景很浅?
尝试将style属性设置为:
style="@android:style/Widget.ProgressBar.Inverse"
答案 1 :(得分:5)
假设存在UI阻止问题,您可以扩展AsyncTask
并以这种方式使用它:
ProgressDialog m_dialog;
protected void readData(final String whatToFind) {
if (whatToFind.length() == 0) {
adapter.notifyDataSetChanged();
return;
}
m_dialog = new ProgressDialog(this);
new LengthyTask().execute();
}
//AsyncTask<Params, Progress, Result>
//Params: type passed in the execute() call, and received in the doInBackground method
//Progress: type of object passed in publishProgress calls
//Result: object type returned by the doInBackground method, and received by onPostExecute()
private class LengthyTask extends AsyncTask<Object, Integer, Object> {
@Override
protected void onPreExecute() {
super.onPreExecute();
// initialize the dialog
m_dialog.setTitle("Searching...");
m_dialog.setMessage("Please wait while searching...");
m_dialog.setIndeterminate(true);
m_dialog.setCancelable(true);
m_dialog.show();
}
@Override
protected Object doInBackground(Object... params) {
// do the hard work here
// call publishProgress() to make any update in the UI
}
@Override
protected void onProgressUpdate(Integer... values) {
// called from publishProgress(), you can update the UI here
// for example, you can update the dialog progress
// m_dialog.setProgress(values[0]); --> no apply here, because we made it indeterminate
}
@Override
protected void onPostExecute(Object result) {
super.onPostExecute(result);
// close the dialog
m_dialog.dismiss();
//do any other UI related task
}
}
答案 2 :(得分:5)
也许我误解了这个问题,但对于那些试图让他们的自定义不确定ProgressBar
旋转的人来说,希望这可以帮助你解决问题。将android:indeterminateDrawable
设置为不是实际资产,而是设置为您的自定义可绘制资源。
定义res / drawable / progress_indeterminate_custom.xml:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
<rotate
android:drawable="@drawable/your_custom_drawable"
android:fillAfter="true"
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="360" />
</item>
</layer-list>
当任务开始和结束时,您可以分别设置ProgressBar
到VISIBLE
和GONE
的可见性。
如果你想修改轮换的速度,this answer说要将toDegrees
更改为360的倍数(即720,1080等)。
答案 3 :(得分:3)
在我的情况下,我只是忘记了所有动画都在设备上禁用。没有阻止或任何不良的控制设置。
答案 4 :(得分:1)
AsyncTask应该可以解决这个问题,但是我建议Android Annotations使这类事情不那么冗长(而且容易得多)。
void myMethod() {
someBackgroundWork("hello", 42);
}
背景中发生的事情:
@Background
void someBackgroundWork(String aParam, long anotherParam) {
[...]
doInUiThread("hello", 42);
}
可以在UI线程中调用某些内容。
@UiThread
void doInUiThread(String aParam, long anotherParam) {
[...]
}
单独使用Android注释可能是值得的,但还有许多其他有用的注释。