2016-02-09 13 views
6

Ich benutze android.support.v4.widget.SwipeRefreshLayout in meiner Android App. Es umschließt eine ListView. Der Inhalt der Listenansicht wird von einem Server heruntergeladen.Android ProgressBar style wie Fortschritt in SwipeRefreshLayout

Eine Fortschrittsanzeige wird angezeigt, wenn der Benutzer nach unten wischt, um Daten vom Server neu zu laden. Die Fortschrittsansicht sieht wie ein Kreis aus, der während der Animation vergrößert und verkleinert wird. Es scheint, dass der Stil dieser Fortschrittsansicht nicht besonders angepasst werden kann. Ich bin jedoch mit seinem eingebauten Stil in Ordnung.

Ich zeige auch die gleiche Fortschrittsanimation während des anfänglichen Datenladens. Dies kann durch Aufruf von mySwipeRefreshLayout.setRefreshing(true) erreicht werden. Das ist auch vollkommen in Ordnung.

Allerdings möchte ich die gleiche Fortschrittsanzeige durch die ganze App zeigen. Betrachten wir z.B. eine andere Aktivität, die wie ein Formular mit Absenden-Schaltfläche aussieht. Es gibt weder eine ListView noch eine SwipeRefreshLayout in dieser Form Aktivität. Einige Fortschrittsanzeigen sollten angezeigt werden, während die übermittelten Daten an den Server übertragen werden. Ich möchte einen Fortschrittsbalken mit der gleichen Animation wie in SwipeRefreshLayout zeigen.

Gibt es eine einfache und saubere Methode, um sowohl für eine SwipeRefreshLayout als auch für eine Formularaktivität, die keine Listenansicht und kein Aktualisierungslayout enthält und keine Wischgeste unterstützt, dieselbe Fortschrittsanzeige zu haben?

Danke.

Antwort

7

Allerdings würde ich gerne die gleiche Fortschrittsanzeige durch die ganze App zeigen. Betrachten wir z.B. eine andere Aktivität, die aussieht wie ein Formular mit Senden-Schaltfläche. Es gibt weder ein ListView noch ein SwipeRefreshLayout in dieser Formularaktivität. Einige Fortschrittsanzeigen sollten angezeigt werden, während die übermittelten Daten an den Server übertragen werden. Ich möchte einen Fortschrittsbalken mit der gleichen Animation wie in SwipeRefreshLayout zeigen.

ja können Sie SwipeRefreshLayout wie ProgressDialog zu zeigen, verwenden klicken, wenn die Taste. Überprüfen Sie unten.

enter image description here

i SwipeRefreshLayout in meinem Layout-Datei ist noch hinzugefügt haben dort ListView oder ScrollView nicht. wie unten

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" 
    tools:context="niu.com.djandroid.jdroid.androidstack.MainActivity" 
    tools:showIn="@layout/activity_main"> 

    <android.support.v4.widget.SwipeRefreshLayout 
     android:id="@+id/activity_main_swipe_refresh_layout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:orientation="vertical"> 

      <TextView 
       android:id="@+id/textView" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="Hello World!" /> 

      <SeekBar 
       android:id="@+id/seekBar" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_marginTop="54dp" /> 

      <Button 
       android:id="@+id/button" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="New Button" /> 
     </LinearLayout> 
    </android.support.v4.widget.SwipeRefreshLayout> 


</LinearLayout> 

jetzt in meiner Tätigkeit verwendet i AsyncTaskSwipeRefreshLayout zu zeigen. Verwenden Sie auch mSwipeRefreshLayout.setOnRefreshListener(null), um die Wischgeste zu stoppen.

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.activity_main_swipe_refresh_layout); 


     mSwipeRefreshLayout.setOnRefreshListener(null); 

     ((Button) findViewById(R.id.button)).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // mSwipeRefreshLayout.setRefreshing(true); 
       // call AsyncTask 
       new LongOperation().execute(""); 
      } 
     }); 

    } 

    private class LongOperation extends AsyncTask<String, Void, String> { 

     @Override 
     protected String doInBackground(String... params) { 
      for (int i = 0; i < 5; i++) { 
       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        Thread.interrupted(); 
       } 
      } 
      return "Executed"; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      // stop mSwipeRefreshLayout 
      mSwipeRefreshLayout.setRefreshing(false); 
     } 

     @Override 
     protected void onPreExecute() { 
      // start mSwipeRefreshLayout 
      mSwipeRefreshLayout.setRefreshing(true); 
     } 

     @Override 
     protected void onProgressUpdate(Void... values) { 
     } 
    } 

EDITED:

Sie SwipeRefreshLayoutBottom Bibliothek von Github verwenden können. dasselbe wie swiperefreshlayout.überprüfen unter

enter image description here

+0

Danke für komplexes Beispiel (+1). Ich muss zugeben, dass ich zu faul war, um selbst mit diesem Ansatz zu experimentieren. Ich müsste alle meine Aktivitäten mit "SwipeRefreshLayout" umhüllen, nur um seine Fortschrittsanimation zu "stehlen". Ich halte dies für eine "schmutzige" Lösung. Ich hoffte, dass es möglicherweise z.B. eine Möglichkeit, einen Stil auf "ProgressBar" zu setzen, so dass er ähnlich aussieht wie die Fortschrittsansicht von 'SwipeRefreshLayout'. – Cimlman

+0

@Cimlman: Überprüfen Sie die bearbeitete Antwort! –

+0

Nicht sicher, ich würde dies als eine schmutzige Lösung betrachten, es war einfach zu implementieren für eine Webansicht und sieht viel besser aus als die Standard-Fortschrittsbalken. Vielen Dank! –

0
mSwipeRefreshLayout.setOnRefreshListener(null) 

nicht für mich arbeiten, so habe ich diese Methode zu aktivieren und deaktivieren erfrischend.

private void setToRefresh(boolean refresh) { 
    if (refresh) { 
     mSwipeRefreshLayout.setEnabled(true); 
     mSwipeRefreshLayout.setRefreshing(true); 
    } else { 
     mSwipeRefreshLayout.setRefreshing(false); 
     mSwipeRefreshLayout.setEnabled(false); 
    } 
}