J'utilise actuellement dans mon application une liste de diffusion nécessitant peut-être une seconde pour être affichée.
Ce que je fais actuellement utilise la propriété @ id/Android: empty de la listview pour créer un texte "en cours 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 cela par le cercle animé utilisé dans une boîte de dialogue de chargement au lieu de ce texte, je suppose que vous savez tous ce que je veux dire:
Edit: Je ne veux pas de dialogue. Je veux montrer cela dans ma mise en page.
Merci beaucoup pour votre aide!
Il suffit de placer ce bloc xml dans le fichier de mise en page 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 avez fini de charger, appelez cette ligne:
findViewById(R.id.loadingPanel).setVisibility(View.GONE);
Le résultat (et ça tourne aussi):
Vous pouvez le faire en utilisant le code 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 utiliser cela, vous devez masquer vos éléments d'interface utilisateur en définissant la valeur de visibilité sur GONE et chaque fois que les données sont chargées, appelez 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/fonction de chargement mais souhaitez simplement que le panneau de chargement disparaisse après x secondes, utilisez un Handle pour déclencher le masquage/l'affichage.
Ceci est généralement appelé dialogue indéterminé barre de progression ou progrès indéterminé.
Combinez cela avec un Thread et un Handler pour obtenir exactement ce que vous voulez. Il existe un certain nombre d'exemples sur la façon de le faire via Google ou ici sur SO. Je recommande fortement de passer du temps à apprendre à utiliser cette combinaison de classes pour effectuer une tâche de ce type. Il est incroyablement utile pour de nombreux types d’applications et vous donnera un bon aperçu de la façon dont les threads et les gestionnaires peuvent fonctionner ensemble.
Je vais vous expliquer comment cela fonctionne:
L'événement de chargement lance la boîte de dialogue:
//maybe in onCreate
showDialog(MY_LOADING_DIALOG);
fooThread = new FooThread(handler);
fooThread.start();
Maintenant le fil 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 thread 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);
}
}
};
Si vous souhaitez ne pas gonfler une autre vue simplement pour indiquer la progression, procédez comme suit:
Android se chargera de la visibilité de la barre de progression.
Par exemple, dans activity_main.xml
:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical"
tools:context="com.fcchyd.linkletandroid.MainActivity">
<ListView
Android:id="@+id/list_view_xml"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:divider="@color/colorDivider"
Android:dividerHeight="1dp" />
<ProgressBar
Android:id="@+id/loading_progress_xml"
style="?android:attr/progress"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_centerHorizontal="true"
Android:layout_centerVertical="true" />
</RelativeLayout>
Et en MainActivity.Java
:
package com.fcchyd.linkletandroid;
import Android.os.Bundle;
import Android.support.v7.app.AppCompatActivity;
import Android.util.Log;
import Android.widget.ArrayAdapter;
import Android.widget.ListView;
import Java.util.ArrayList;
import Java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class MainActivity extends AppCompatActivity {
final String debugLogHeader = "Linklet Debug Message";
Call<Links> call;
List<Link> arraylistLink;
ListView linksListV;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
linksListV = (ListView) findViewById(R.id.list_view_xml);
linksListV.setEmptyView(findViewById(R.id.loading_progress_xml));
arraylistLink = new ArrayList<>();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.links.linklet.ml")
.addConverterFactory(GsonConverterFactory
.create())
.build();
HttpsInterface HttpsInterface = retrofit
.create(HttpsInterface.class);
call = HttpsInterface.httpGETpageNumber(1);
call.enqueue(new Callback<Links>() {
@Override
public void onResponse(Call<Links> call, Response<Links> response) {
try {
arraylistLink = response.body().getLinks();
String[] simpletTitlesArray = new String[arraylistLink.size()];
for (int i = 0; i < simpletTitlesArray.length; i++) {
simpletTitlesArray[i] = arraylistLink.get(i).getTitle();
}
ArrayAdapter<String> simpleAdapter = new ArrayAdapter<>(MainActivity.this, Android.R.layout.simple_list_item_1, simpletTitlesArray);
linksListV.setAdapter(simpleAdapter);
} catch (Exception e) {
Log.e("erro", "" + e);
}
}
@Override
public void onFailure(Call<Links> call, Throwable t) {
}
});
}
}
Vous pouvez utiliser ce code depuis firebase github samples ..
Vous n'avez pas besoin d'éditer dans les fichiers de modèles ... créez simplement 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é, vous souhaitez utiliser la boîte de 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();
Pour ceux qui se développent à Kotlin, il existe une méthode sweet fournie par la bibliothèque Anko qui rend le processus d'affichage de ProgressDialog
un jeu d'enfant!
Basé sur ce lien:
val dialog = progressDialog(message = "Please wait a bit…", title = "Fetching data")
dialog.show()
//....
dialog.dismiss()
Cela affichera un dialogue de progression avec le% de progression affiché (pour lequel vous devez également passer le paramètre init
pour calculer la progression).
Il existe également la méthode indeterminateProgressDialog()
, qui fournit l'animation du cercle en rotation indéfiniment jusqu'à ce qu'elle soit rejetée:
indeterminateProgressDialog("Loading...").show()
Crier à ce blog qui m'a conduit à cette solution.