233 votes

Utilisation du "cercle animé" dans une ImageView lors du chargement de matériel

J'utilise actuellement dans mon application une vue de liste qui a besoin d'une seconde pour être affichée.

Ce que je fais actuellement, c'est utiliser la propriété @id/Android:empty du listview pour créer un texte de "chargement".

 <TextView android:id="@id/android:empty"
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           android:background="#FF0000"
           android:text="Loading..."/>

Maintenant, je voudrais remplacer ce texte par le cercle animé qui est utilisé dans une boîte de dialogue de chargement, je suppose que vous voyez tous ce que je veux dire :

Edit : Je ne veux pas de dialogue. Je veux l'afficher dans ma mise en page.

http://flexfwd.com/DesktopModules/ATI_Base/resources/images/loading_blue_circle.gif

Merci beaucoup pour votre aide !

496voto

user1032613 Points 2229

Il suffit de placer ce bloc de xml dans le fichier de présentation de votre activité :

<RelativeLayout
    android:id="@+id/loadingPanel"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center" >

    <ProgressBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:indeterminate="true" />
</RelativeLayout>

Et quand vous aurez fini de charger, appelez cette ligne :

findViewById(R.id.loadingPanel).setVisibility(View.GONE);

Le résultat (et il tourne aussi) :

enter image description here

22 votes

A écrasé le bouton +1

1 votes

Je ne vois pas comment cela résout le problème de l'affichage d'un cercle animé dans une ImageView.

5 votes

@Gustavo, c'est ce qu'il veut, montrer une "animation de progression indéterminée", donc je pense que cela résout le problème ;-].

145voto

Kurru Points 6746

Vous pouvez le faire en utilisant le xml suivant

<RelativeLayout
    style="@style/GenericProgressBackground"
    android:id="@+id/loadingPanel"
    >
    <ProgressBar
        style="@style/GenericProgressIndicator"/>
</RelativeLayout>

Avec ce style

<style name="GenericProgressBackground" parent="android:Theme">
    <item name="android:layout_width">fill_parent</item>    
    <item name="android:layout_height">fill_parent</item>
    <item name="android:background">#DD111111</item>    
    <item name="android:gravity">center</item>  
</style>
<style name="GenericProgressIndicator" parent="@android:style/Widget.ProgressBar.Small">
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:indeterminate">true</item> 
</style>

Pour l'utiliser, vous devez masquer vos éléments d'interface utilisateur en fixant la valeur de visibilité à GONE et, à chaque fois que les données sont chargées, appeler setVisibility(View.VISIBLE) sur toutes vos vues pour les restaurer. N'oubliez pas d'appeler findViewById(R.id.loadingPanel).setVisiblity(View.GONE) pour masquer l'animation de chargement.

Si vous n'avez pas d'événement ou de fonction de chargement mais que vous souhaitez simplement que le panneau de chargement disparaisse après x secondes, utilisez l'option Poignée pour déclencher le masquage/affichage.

4 votes

Excellente réponse. Trouvée via une recherche Google, elle a également résolu mon problème. Merci !

0 votes

En utilisant cette méthode, j'obtiens une exception NullPointerException sur l'écran d'accueil de l'utilisateur. findViewById(...).setVisibility(View.GONE) ligne lorsque je fais pivoter l'écran. Cela fonctionne comme un charme dans une orientation, mais avez-vous une idée de la raison pour laquelle cela pourrait être cassé ?

0 votes

J'ai une question à poser. Mon RelativeLayout se trouve entre deux boutons à l'intérieur d'un Linear Layout également entre les boutons. Lorsque je l'exécute, il occupe tout l'écran. Avez-vous des conseils pour maintenir cette barre de chargement entre les deux boutons ?

10voto

user432209 Points 7460

C'est ce que l'on appelle généralement un "indéterminé". Barre de progression ou la boîte de dialogue Progression indéterminée.

Combinez cela avec un Fil conducteur et un Manipulateur pour obtenir exactement ce que vous voulez. Il existe un certain nombre d'exemples sur la façon de procéder via Google ou ici même sur SO. Je recommande vivement de prendre le temps d'apprendre à utiliser cette combinaison de classes pour effectuer une tâche comme celle-ci. Elle est incroyablement utile dans de nombreux types d'applications et vous donnera un bon aperçu de la façon dont les Threads et les Handlers peuvent fonctionner ensemble.

Je vais vous expliquer comment ça marche :

L'événement de chargement lance le dialogue :

//maybe in onCreate
showDialog(MY_LOADING_DIALOG);
fooThread = new FooThread(handler);
fooThread.start();

Maintenant, c'est le fil qui fait le travail :

private class FooThread extends Thread {
    Handler mHandler;

    FooThread(Handler h) {
        mHandler = h;
    }

    public void run() { 
        //Do all my work here....you might need a loop for this

        Message msg = mHandler.obtainMessage();
        Bundle b = new Bundle();                
        b.putInt("state", 1);   
        msg.setData(b);
        mHandler.sendMessage(msg);
    }
}

Enfin, récupérez l'état du fil lorsqu'il est terminé :

final Handler handler = new Handler() {
    public void handleMessage(Message msg) {
        int state = msg.getData().getInt("state");
        if (state == 1){
            dismissDialog(MY_LOADING_DIALOG);
            removeDialog(MY_LOADING_DIALOG);
        }
    }
};

2 votes

Votre réponse semble très bien, mais je voudrais l'insérer dans ma mise en page... La réponse de Venkatesh semble plus appropriée à mon utilisation... Je vais essayer et envoyer des commentaires. Merci beaucoup pour votre temps !

0 votes

Merci pour celui-ci, il est en fait bon d'avoir une solution à la fois pour le XML et la façon programmatique de faire les choses.

3voto

khateeb Points 278

Vous pouvez utiliser ce code à partir de échantillons de firebase github ..

Vous n'avez pas besoin de modifier les fichiers de mise en page ... il suffit de créer une nouvelle classe "BaseActivity".

package com.example;

import android.app.ProgressDialog;
import android.support.annotation.VisibleForTesting;
import android.support.v7.app.AppCompatActivity;

public class BaseActivity extends AppCompatActivity {

    @VisibleForTesting
    public ProgressDialog mProgressDialog;

    public void showProgressDialog() {
        if (mProgressDialog == null) {
            mProgressDialog = new ProgressDialog(this);
            mProgressDialog.setMessage("Loading ...");
            mProgressDialog.setIndeterminate(true);
        }

        mProgressDialog.show();
    }

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

    @Override
    public void onStop() {
        super.onStop();
        hideProgressDialog();
    }

}

Dans votre activité que vous voulez utiliser le dialogue de progression .

public class MyActivity extends BaseActivity

Avant/après la fonction qui prend du temps

showProgressDialog();
.... my code that take some time
showProgressDialog();

1voto

Venky Points 8716

Vérifiez ceci pour référence .. Dialogue en cercle animé .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X