Android: ProgressDialog не показывает
Я пытаюсь создать ProgressDialog для Android-приложения (просто простое, показывающее пользователю, что происходит, без кнопок или чего-то еще), но я не могу сделать это правильно. Я прошел через форумы и учебники, а также Sample-Code, который поставляется с SDK, но безрезультатно.
Вот что я получил:
btnSubmit.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
(...)
ProgressDialog pd = new ProgressDialog(MyApp.this);
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.setMessage("Working...");
pd.setIndeterminate(true);
pd.setCancelable(false);
// now fetch the results
(...long time calculations here...)
// remove progress dialog
pd.dismiss();
Я также попытался добавить pd.show();
и возиться с параметром в new ProgressDialog
ничего не получится (кроме ошибок, из-за которых выбранный параметр не будет работать), что означает: ProgressDialog никогда не будет отображаться. Приложение просто продолжает работать, как будто я никогда не добавлял диалог.
Я не знаю, создаю ли я диалог в нужном месте, я немного его передвинул, но это тоже не помогло. Может я не в том контексте? Код выше находится внутри private ViewGroup _createInputForm()
в MyApp
,
Любая подсказка ценится,
4 ответа
Вы должны вызвать pd.show до того, как начнутся длинные вычисления, а затем вычисления должны выполняться в отдельном потоке. Как только этот поток завершится, вы должны вызвать pd.dismiss(), чтобы закрыть диалоговое окно prgoress.
здесь вы можете увидеть пример:
ProgressDialog создается и отображается, и вызывается поток для выполнения сложных вычислений:
@Override
public void onClick(View v) {
pd = ProgressDialog.show(lexs, "Search", "Searching...", true, false);
Search search = new Search( ... );
SearchThread searchThread = new SearchThread(search);
searchThread.start();
}
а тут нить
private class SearchThread extends Thread {
private Search search;
public SearchThread(Search search) {
this.search = search;
}
@Override
public void run() {
search.search();
handler.sendEmptyMessage(0);
}
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
displaySearchResults(search);
pd.dismiss();
}
};
}
Я даю вам решение для этого, попробуйте это... Сначала определите диалог прогресса в действии, прежде чем onCreate()
метод
private ProgressDialog progressDialog;
Сейчас в onCreate
В этом случае вы можете нажать кнопку "Любой", чтобы изменить действие для любого действия. Просто установите там индикатор выполнения.
progressDialog = ProgressDialog.show(FoodDriveModule.this, "", "Loading...");
Теперь используйте нить, чтобы обрабатывать индикатор выполнения для отображения и скрытия
new Thread()
{
public void run()
{
try
{
sleep(1500);
// do the background process or any work that takes time to see progress dialog
}
catch (Exception e)
{
Log.e("tag",e.getMessage());
}
// dismiss the progress dialog
progressDialog.dismiss();
}
}.start();
Это все!
Это также возможно с помощью AsyncTask. Этот класс создает поток для вас. Вы должны разделить его на подклассы и заполнить doInBackground(...)
метод.