2016-02-09 23 views
6

Używam android.support.v4.widget.SwipeRefreshLayout w mojej aplikacji na Androida. Łączy się z ListView. Zawartość widoku listy jest pobierana z serwera.Android ProgressBar w stylu widoku postępu w SwipeRefreshLayout

Widok postępu wyświetlany jest po przesunięciu użytkownika w celu ponownego załadowania danych z serwera. Widok postępu wygląda jak kawałek koła, który rośnie i kurczy się podczas animacji. Wygląda na to, że styl tego widoku postępu nie może być specjalnie dostosowany. Jednak jestem w porządku z jego wbudowanym stylem.

Wyświetlam również tę samą animację postępu podczas początkowego ładowania danych. Można to osiągnąć, dzwoniąc pod numer mySwipeRefreshLayout.setRefreshing(true). To też jest w porządku.

Chciałbym jednak pokazać to samo wskazanie postępu przez całą aplikację. Rozważ np. inna aktywność, która wygląda jak formularz z przyciskiem przesyłania. W tej aktywności formularza nie ma ani wartości ListView ani SwipeRefreshLayout. Podczas przesyłania przesłanych danych do serwera powinno być wyświetlane wskazanie postępu. Chcę pokazać pasek postępu z tą samą animacją jak w SwipeRefreshLayout.

Czy istnieje prosty i przejrzysty sposób na uzyskanie tego samego wskaźnika postępu zarówno dla SwipeRefreshLayout, jak i działania formularza, który nie zawiera żadnego widoku listy i odświeżania układu i nie obsługuje żadnego gestu przesuwania?

Dzięki.

Odpowiedz

7

Chciałbym jednak pokazać to samo wskazanie postępu za pomocą całej aplikacji . Rozważ np. inna czynność, która wygląda jak formularz z przyciskiem przesyłania . W tym formularzu nie ma ani ListView, ani SwipeRefreshLayout w . Należy wyświetlić pewne informacje o postępie, a przesłane dane zostaną przesłane do serwera. Chcę wyświetlić pasek postępu z taką samą animacją jak w SwipeRefreshLayout.

tak można użyć SwipeRefreshLayout aby pokazać jak ProgressDialog podczas kliknięcia przycisku. sprawdź poniżej.

enter image description here

dodałem SwipeRefreshLayout wewnątrz mojego pliku układ nadal nie ma ListView lub ScrollView. tak jak poniżej

<?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> 

Teraz w mojej działalności użyłem AsyncTask pokazać SwipeRefreshLayout. również użyj mSwipeRefreshLayout.setOnRefreshListener(null), aby zatrzymać gest machnięcia.

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

edycja:

można użyć SwipeRefreshLayoutBottom bibliotekę z Github. to samo, co swiperefreshlayout.sprawdź poniżej

enter image description here

+0

Dzięki za złożony przykład (+1). Muszę przyznać, że byłem zbyt leniwy, aby samemu eksperymentować z tym podejściem. Będę musiał owijać wszystkie moje działania za pomocą 'SwipeRefreshLayout', żeby" ukraść "jego animację postępu. Uważam to za "brudne" rozwiązanie. Miałem nadzieję, że może być np. sposób, aby ustawić jakiś styl na 'ProgressBar', aby wyglądał podobnie do widoku postępu' SwipeRefreshLayout'. – Cimlman

+0

@Cimlman: sprawdź edytowaną odpowiedź! –

+0

Nie jestem pewien, czy uznałabym to za brudne rozwiązanie, to było łatwe do wdrożenia w celu wyświetlenia strony internetowej i wygląda o wiele lepiej niż standardowe paski postępu. Dzięki! –

0
mSwipeRefreshLayout.setOnRefreshListener(null) 

nie działa dla mnie, więc zrobiłem ten sposób włączania i wyłączania orzeźwiający.

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