Melhor maneira de mostrar um indicador de carregamento / progresso?


147

Qual é a melhor maneira de mostrar um controle giratório de carregamento enquanto o aplicativo aguarda uma resposta do servidor?

Isso pode ser feito programaticamente? Para que eu não precise adicionar o controle giratório de carga no arquivo xml?

Respostas:


293

O ProgressDialog foi descontinuado do Android Oreo. Use ProgressBar vez

ProgressDialog progress = new ProgressDialog(this);
progress.setTitle("Loading");
progress.setMessage("Wait while loading...");
progress.setCancelable(false); // disable dismiss by tapping outside of the dialog
progress.show();
// To dismiss the dialog
progress.dismiss();

OU

ProgressDialog.show(this, "Loading", "Wait while loading...");

Leia mais aqui.

A propósito, o Spinner tem um significado diferente no Android. (É como o menu suspenso de seleção em HTML)


1
No site do desenvolvedor do Android: STYLE_SPINNER Cria um ProgressDialog com uma barra de progresso circular e giratória.
Tequilaman

34
Isso funciona, mas quando eu testei isso, eu poderia descartar a caixa de diálogo tocando na tela fora dela ou pressionando o botão Voltar . Corrigi isso adicionando uma chamada para progress.setCancelable(false);.
Sam

1
Obrigado pelo comentário de baixo. Eu estava ficando louco porque estava tentando fazer o 'spinner' trabalhar por uma hora.
Pode Poyrazoğlu

soberbo, agora eu posso usar de diálogo de progresso
Faisal


17

ProgressDialog ficou obsoleto desde o nível 26 da API, https://developer.android.com/reference/android/app/ProgressDialog.html

Incluo uma ProgressBar no meu layout

   <ProgressBar
        android:layout_weight="1"
        android:id="@+id/progressBar_cyclic"
        android:visibility="gone"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:minHeight="40dp"
        android:minWidth="40dp" />

e altere sua visibilidade para .GONE | .VISIBLE dependendo do caso de uso.

    progressBar_cyclic.visibility = View.VISIBLE

Não tenho certeza, mas o progressBar é executado sempre em segundo plano (apenas oculto na interface do usuário) depois de torná-lo invisível?
Shambhu 15/05

16

Usar ProgressDialog

ProgressDialog.show(Context context, CharSequence title, CharSequence message);

insira a descrição da imagem aqui

No entanto, isso é considerado hoje um anti-padrão (2013): http://www.youtube.com/watch?v=pEGWcMTxs3I


12
@artworkad シ Então, qual aspecto disso é considerado ruim - a resposta aceita é um exemplo do mesmo antipadrão? E o que é recomendado fazer em seu lugar? Vincular a um vídeo externo sobre vários problemas de UX realmente não melhora esta resposta.
Larsh


9

Na verdade, se você estiver esperando pela resposta de um servidor, isso deve ser feito programaticamente. Você pode criar uma caixa de diálogo de progresso e descartá-la, mas, novamente, esse não é o "modo android".

Atualmente, o método recomendado é usar um DialogFragment :

public class MySpinnerDialog extends DialogFragment {

    public MySpinnerDialog() {
        // use empty constructors. If something is needed use onCreate's
    }

    @Override
    public Dialog onCreateDialog(final Bundle savedInstanceState) {

        _dialog = new ProgressDialog(getActivity());
        this.setStyle(STYLE_NO_TITLE, getTheme()); // You can use styles or inflate a view
        _dialog.setMessage("Spinning.."); // set your messages if not inflated from XML

        _dialog.setCancelable(false);  

        return _dialog;
    }
}

Em sua atividade, você define seu gerenciador de fragmentos e mostra a caixa de diálogo assim que a espera pelo servidor é iniciada:

FragmentManager fm = getSupportFragmentManager();
MySpinnerDialog myInstance = new MySpinnerDialog();
}
myInstance.show(fm, "some_tag");

Depois que o servidor responder, você o descartará:

myInstance.dismiss()

Lembre-se de que o progressdialog é um spinner ou uma barra de progresso, dependendo dos atributos, leia mais no guia da API


ProgressDialog.show (contexto de contexto, título de CharSequence, mensagem de CharSequence); Passar o parâmetro title como uma string vazia remove o título: ProgressDialog.show (context, "", "Loading ..");
Rajendra

1
Bom exemplo, embora ainda fosse possível usar o botão Voltar. Eu acho que é por causa da sua variável dlgAlert (e de onde vem isso btw? :)). Enfim - já que você está estendendo o fragmento de diálogo, basta chamar setCancelable (false) e ele funcionará.
Lasse

A confirmação de transações de fragmentos em um momento indeterminista quando o servidor retorna uma resposta não parece ser à prova de idiotas. Por exemplo, quando a resposta volta, a atividade que hospeda o fragmento pode estar no estado errado. Qualquer solução?
Jonas

Verifique se você está importando android.support.v4.app.DialogFragment e não android.app.DialogFragment, ou não pode usar o getSupportFragmentManager (consulte stackoverflow.com/questions/27514338/… )
StCleezy


6

Foi assim que fiz isso para que apenas uma caixa de diálogo de progresso possa ser aberta por vez. Baseado na resposta de Suraj Bajaj

private ProgressDialog progress;



public void showLoadingDialog() {

    if (progress == null) {
        progress = new ProgressDialog(this);
        progress.setTitle(getString(R.string.loading_title));
        progress.setMessage(getString(R.string.loading_message));
    }
    progress.show();
}

public void dismissLoadingDialog() {

    if (progress != null && progress.isShowing()) {
        progress.dismiss();
    }
}

Eu também tive que usar

protected void onResume() {
    dismissLoadingDialog();
    super.onResume();
}

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.