wake-up-neo.com

Verwenden des "animierten Kreises" in einer ImageView während des Ladens

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.

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

Vielen Dank für Ihre Hilfe!

193
Waza_Be

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): 

enter image description here

371
user1032613

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.

141
Kurru

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);
        }
    }
};
10
user432209

Wenn Sie keine weitere Ansicht nur zum Anzeigen des Fortschritts anzeigen möchten, gehen Sie wie folgt vor:

  1. Erstellen Sie ProgressBar im selben XML-Layout der Listenansicht.
  2. Mach es zentriert
  3. Gib es eine Id
  4. Hängen Sie es an Ihre Listenansicht-Instanzvariable an, indem Sie setEmptyView aufrufen

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) {

        }
    });


}

}

 

1
Md_Zubair Ahmed

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();
1
khateeb

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. 

0
DarkCygnus