2015-05-09 2 views
0

В моем приложении я хотел бы показать ProgressDialog о некоторых событиях (например, AsyncTasks). Я никогда не хочу показывать несколько ProgressDialogs одновременно.Лучшая практика для показа ProgressDialogs через приложение?

Каков наилучший и эффективный способ сделать это? Мой текущий код выглядит следующим образом:

public class ProgressDialogHelper { 
    private static ProgressDialog progressDialog; 

    public static void showProgressDialog(Context c) { 
     if (progressDialog == null) { 
      progressDialog = ProgressDialog.show(c, null, null); 
      progressDialog.setContentView(R.layout.progress_bar); 
     } 
    } 

    public static void dismissProgressDialog() { 
     if (progressDialog != null) { 
      progressDialog.dismiss(); 
      progressDialog = null; 
     } 
    } 
} 

Я называю эти методы из моих других классов, чтобы показать/отклонить ProgressDialog.

Считается ли это хорошей практикой? Если нет, как мне это сделать?

ответ

5

Вы просите о лучшей практике. На самом деле лучше всего не использовать ProgressDialog, так как они блокируют взаимодействие пользователя с приложением.

Существует много альтернатив, чтобы не использовать ProgressDialog.

Если ваше приложение загружает данные, которые требуются для списка, разместите Spinner вместо ListView.

Для некоторого дополнительного чтения в этой теме смотрите здесь: Google Design Guidelines: Progress


Если вы все еще хотите использовать ProgressDialog я настоятельно рекомендую не использовать класс, который размещен выше. Он содержит ссылку static на progressDialog, и поэтому он глобально выше всех видов деятельности и живых циклов. Если ваша заявка воссоздана или что-то еще, это может вызвать некоторые проблемы.

Я бы порекомендовал не staticProgressDialogHelper, который вы можете инициализировать за каждые Activity, а затем он обработает Dialog. Также убедитесь, что ручка методы LiveCycle как onDestroy


Имея BaseActivity, как @jagmohan отметил возможно, но если вы не хотите иметь свой собственный BaseActivity и хотите использовать что-то, как падение. Вы можете создать что-то вроде этого:

ProgressDialogHelper.java

public class ProgressDialogHelper { 
    ProgressDialog mProgressDialog; 

    public ProgressDialogHelper() { 

    } 

    public ProgressDialogHelper(Context context, String title, String message) { 
     mProgressDialog = new ProgressDialog(context); 
     mProgressDialog.setTitle(title); 
     mProgressDialog.setMessage(message); 
     mProgressDialog.show(); 
    } 

    public ProgressDialog getProgressDialog() { 
     return mProgressDialog; 
    } 

    public void setProgressDialog(ProgressDialog mProgressDialog) { 
     //make sure the previous dialog is hidden 
     hide(); 
     this.mProgressDialog = mProgressDialog; 
    } 

    public void show() { 
     if (mProgressDialog != null && !mProgressDialog.isShowing()) { 
      mProgressDialog.show(); 
     } 
    } 

    public void create(Context context, String title, String message) { 
     if (mProgressDialog != null) { 
      mProgressDialog.dismiss(); 
     } 
     mProgressDialog = ProgressDialog.show(context, title, message); 
    } 

    public void hide() { 
     if (mProgressDialog != null && mProgressDialog.isShowing()) { 
      mProgressDialog.dismiss(); 
      mProgressDialog = null; 
     } 
    } 

    public void onDestroy() { 
     hide(); 
    } 
} 
+1

Не могли бы вы привести пример, как использовать свой класс –

+0

@MinaFawzy создать новый экземпляр помощника, а затем просто использовать create, show, hide, onDestroy – mikepenz

3

Как отметил @mikepenz, используя ProgressDialogs не рекомендуется в последних руководствах по дизайну. Однако, вот что-то, что хорошо работало для меня в прошлом.

Я использовал для установки базы Activity и добавил несколько методов, чтобы скрыть и показать диалог прогресса в этом классе.

public class BaseActivity extends ActionBarActivity { 

    protected static final String TAG = BaseActivity.class.getSimpleName(); 
    protected ProgressDialog mProgressDialog; 

    protected void showProgressDialog(String title, String message) { 
     if (mProgressDialog != null) { 
      mProgressDialog.dismiss(); 
     } 
     mProgressDialog = ProgressDialog.show(this, title, message); 
    } 

    protected void hideProgressDialog() { 
     if (mProgressDialog != null && mProgressDialog.isShowing()) { 
      mProgressDialog.dismiss(); 
      mProgressDialog = null; 
     } 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     // hide progress dialog to prevent leaks 
     hideProgressDialog(); 
    } 

    // other stuff... 
} 

Теперь вы можете расширить эту базовую деятельность в новых классах деятельности создаваемых в проекте и использовать эти методы, чтобы показать/скрыть диалоговые окна выполнения.

Btw, просто убедитесь, что вы вызываете методы show/hide из потока пользовательского интерфейса.

Надеюсь, это ответит на ваш вопрос.

Смежные вопросы