2015-07-09 3 views
1

В моей MainActivity's xml файле, activity_main.xml У меня есть FrameLayout показывает список оговорок:ProgressBar анимация показывает только один раз

<ProgressBar android:id="@+id/login_progress" style="?android:attr/progressBarStyleLarge" 
     android:layout_width="wrap_content" android:layout_height="wrap_content" 
     android:layout_marginBottom="8dp" android:layout_marginTop="16dp" 
     android:visibility="gone" 
     android:layout_gravity="center"/> 

    <FrameLayout android:id="@+id/home_page_frame" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 

Когда пользователь хочет устранить одну оговорку, нажав на него, список должен быть обновлен поэтому я выполнить вызов к сети, используя этот метод:

public void cancelReservation(ReservationResponse rR){ 
    if (mNetwork != null) {return;} 
    if (isNetworkAvailable()) { 
     showProgress(true); 
     mNetwork = new NetworkTask(this, "cancel_reservation", rR); 
     mNetwork.execute((Void) null); 
    }else{ 
     // display error 
     Log.d("LOG_TAG", "No network available!"); 
     Toast.makeText(this, R.string.no_network_dialog ,Toast.LENGTH_LONG).show(); 
    } 
} 

который обновляет AppEngine оговорки и возвращает обновленный список обратно в Activity. Перед выполнением AsyncTask я вызвать метод showProgress, начиная эту простую анимацию:

enter image description here

метод имеет постоянную длительность, в течение которого FrameLayout скрыта в пользу ProgressBar; то в onAnimationEnd методы ProgressBar «S FrameLayout восстанавливается и анимация устанавливается на View.GONE, наконец, показывая обновленный список оговорок:

@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2) 
public void showProgress(final boolean showProgr) { 
    final FrameLayout home_scroll = (FrameLayout) findViewById(R.id.home_page_frame); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) { 
     mProgressView.destroyDrawingCache(); 

     int shortAnimTime = getResources().getInteger(android.R.integer.config_shortAnimTime); 
     home_scroll.setVisibility(showProgr ? View.GONE : View.VISIBLE); 
     mProgressView.setVisibility(showProgr ? View.VISIBLE : View.GONE); 
     mProgressView.animate().setDuration(shortAnimTime*9).alpha(
       showProgr ? 0 : 1).setListener(new AnimatorListenerAdapter() { 
       @Override 
       public void onAnimationEnd(Animator animation) { 
        mProgressView.setVisibility(showProgr ? View.GONE : View.VISIBLE); 
        home_scroll.setVisibility(showProgr ? View.VISIBLE : View.GONE); 
       } 
     }); 

    } else { 
     home_scroll.setVisibility(showProgr ? View.GONE : View.VISIBLE); 
    } 
} 

Моей причудливая проблемой является то, что в то время как в первый раз, когда я отменить заказ анимация отображается, со второго раза каждый раз, когда я отменяю резервирование, анимация не появляется. Как так?

Я попытался с помощью вызова этого метода:

 mProgressView.destroyDrawingCache(); 

, но он не работает ....

ответ

0

Я решил его, изменяя способ я использую метод showProgress() ,

@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2) 
public void showProgress(final boolean showProgr) { 
    // On Honeycomb MR2 we have the ViewPropertyAnimator APIs, which allow 
    // for very easy animations. If available, use these APIs to fade-in 
    // the progress spinner. 
    final FrameLayout home_scroll = (FrameLayout) findViewById(R.id.home_page_frame); 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) { 

     mProgressView.refreshDrawableState();//setVisibility(View.GONE); 
     if(showProgr) { 
      home_scroll.setVisibility(showProgr ? View.GONE : View.VISIBLE); 
      mProgressView.setVisibility(showProgr ? View.VISIBLE : View.GONE); 
      mProgressView.animate(); 

     }else{ 
      mProgressView.setVisibility(showProgr ? View.VISIBLE : View.GONE); 
      mProgressView.invalidate(); 
      mProgressView.clearAnimation(); 
      mProgressView.setActivated(false); 
      home_scroll.setVisibility(showProgr ? View.GONE : View.VISIBLE); 
     } 
    } else { //TODO debug <= HONEYCOMB 
     home_scroll.setVisibility(showProgr ? View.GONE : View.VISIBLE); 
    } 
} 

Прежде чем я использовал метод, установив короткую анимацию и ожидая ее завершения самостоятельно. Insead, не устанавливая таймер и вызывающий метод showProgress два раза, сначала, когда анимация должна начинаться с showProgress(true), а вторая, когда она должна заканчиваться showProgress(false), тогда все работает красиво.

Смежные вопросы