Ich verwende derzeit in meiner Anwendung eine Listenansicht, die möglicherweise eine Sekunde benötigt, um angezeigt zu werden.
Was ich derzeit mache, ist die Verwendung der @ id/Android: empty-Eigenschaft der Listenansicht, um einen "Ladetext" zu erstellen.
<TextView Android:id="@id/Android:empty"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="#FF0000"
Android:text="Loading..."/>
Nun möchte ich das durch den animierten Kreis ersetzen, der in einem Ladedialogfeld anstelle dieses Textes verwendet wird. Ich denke, Sie alle wissen, was ich meine:
Edit: Ich möchte keinen Dialog. Ich möchte das in meinem Layout zeigen.
Vielen Dank für Ihre Hilfe!
Fügen Sie einfach diesen XML-Block in Ihre Aktivitätslayoutdatei ein:
<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>
Und wenn Sie mit dem Laden fertig sind, rufen Sie diese Zeile an:
findViewById(R.id.loadingPanel).setVisibility(View.GONE);
Das Ergebnis (und es dreht sich auch):
Sie können dies mithilfe der folgenden XML-Datei tun
<RelativeLayout
style="@style/GenericProgressBackground"
Android:id="@+id/loadingPanel"
>
<ProgressBar
style="@style/GenericProgressIndicator"/>
</RelativeLayout>
Mit diesem Stil
<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>
Um dies zu verwenden, müssen Sie Ihre Elemente der Benutzeroberfläche ausblenden, indem Sie den Sichtbarkeitswert auf GONE setzen. Wenn die Daten geladen sind, rufen Sie in allen Ansichten setVisibility(View.VISIBLE)
auf, um sie wiederherzustellen. Vergessen Sie nicht, findViewById(R.id.loadingPanel).setVisiblity(View.GONE)
aufzurufen, um die Lade-Animation auszublenden.
Wenn Sie nicht über ein Ladeereignis/eine Ladefunktion verfügen, das Ladefenster jedoch nach x Sekunden verschwinden soll, verwenden Sie ein Handle , um das Ausblenden/Anzeigen auszulösen.
Dies wird allgemein als unbestimmter Fortschrittsbalken oder unbestimmter Fortschrittsdialog bezeichnet.
Kombinieren Sie dies mit einem Thread und einem Handler , um genau das zu erhalten, was Sie möchten. Es gibt eine Reihe von Beispielen, wie dies über Google oder direkt hier bei SO geschehen kann. Ich würde dringend empfehlen, sich die Zeit zu nehmen, um zu lernen, wie man mit dieser Kombination von Klassen eine solche Aufgabe ausführt. Es ist unglaublich nützlich für viele Arten von Anwendungen und gibt Ihnen einen Einblick in die Zusammenarbeit von Threads und Handlern.
Ich werde Sie anfangen, wie das funktioniert:
Das Ladeereignis startet den Dialog:
//maybe in onCreate
showDialog(MY_LOADING_DIALOG);
fooThread = new FooThread(handler);
fooThread.start();
Jetzt erledigt der Thread die Arbeit:
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);
}
}
Holen Sie sich schließlich den Status aus dem Thread zurück, wenn er abgeschlossen ist:
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);
}
}
};
Wenn Sie keine weitere Ansicht nur zum Anzeigen des Fortschritts anzeigen möchten, gehen Sie wie folgt vor:
Android sorgt für die Sichtbarkeit der Fortschrittsleiste.
Zum Beispiel in 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>
Und in 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) {
}
});
}
}
Sie können diesen Code aus firebase github samples .. verwenden.
Sie müssen nicht in Layout-Dateien bearbeiten. Erstellen Sie einfach eine neue Klasse "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();
}
}
In Ihrer Aktivität möchten Sie den Fortschrittsdialog verwenden.
public class MyActivity extends BaseActivity
Vorher/Nachher die Funktion, die Zeit braucht
showProgressDialog();
.... my code that take some time
showProgressDialog();
Für diejenigen, die sich in Kotlin entwickeln, gibt es eine sweet-Methode, die von der Anko -Bibliothek bereitgestellt wird, die das Anzeigen einer ProgressDialog
zu einem Kinderspiel macht!
Basierend auf diesem Link:
val dialog = progressDialog(message = "Please wait a bit…", title = "Fetching data")
dialog.show()
//....
dialog.dismiss()
Daraufhin wird ein Fortschrittsdialogfeld mit dem angezeigten Fortschritt angezeigt (für den Sie den Parameter init
übergeben müssen, um den Fortschritt zu berechnen).
Es gibt auch die Methode indeterminateProgressDialog()
, die die Animation des Drehenden Kreises unbegrenzt bereitstellt, bis sie abgewiesen wird:
indeterminateProgressDialog("Loading...").show()
Ruf an dieses Blog , das mich zu dieser Lösung geführt hat.