2013-07-29 8 views
5

Mam DialogFragment, który ma animacje niektórych układów wewnątrz jego widoku. Po zamknięciu okna dialogowego chcę wykonać animację i po zakończeniu animacji wykonać operację zamknięcia.Animacja DialogFragment układu i "Próba zniszczenia okna podczas rysowania!" error

Krok 1: połączeń fragment z mojej działalności:

myDialog.show(getSupportFragmentManager(), ""); 

Krok 2: Gdy użytkownik zakończył pracę z okna, naciska guzik. Że przycisk wywołuje animację, a potem chcę dialogowe zniknie:

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View layout = inflater.inflate(R.layout.my_layout, null); 

     layMain = (LinearLayout) layout.findViewById(R.id.layMain); 

     TextView btnCancel = (TextView) layout.findViewById(R.id.btnCancel); 
      btnCancel.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View arg0) { 
        final Animation anim = AnimationUtils.loadAnimation(getActivity(), R.anim.translate_to_bottom); 
        anim.setAnimationListener(new AnimationListener() { 

         @Override 
         public void onAnimationStart(Animation animation) { 

         } 

         @Override 
         public void onAnimationRepeat(Animation animation) { 

         } 

         @Override 
         public void onAnimationEnd(Animation animation) { 
          dismiss(); 
         } 
        }); 
        layMain.startAnimation(anim); 
       } 
      }); 
..... 

Kiedy końce animacje, okno zostaje odwołany, ale pojawia się ten błąd na LogCat

E/ViewRootImpl (25507) : Próba zniszczenia okna podczas rysowania! E/ViewRootImpl (25507): [email protected], title = com.mypackage/com.mypackage.MyActivity

Jak można temu zapobiec?

Późniejsza edycja: jeśli używam go bez animacji, wszystko działa poprawnie i na logcat nie wyświetla się żaden błąd. Więc przypuszczam, że musi coś zrobić z animacją.

Animacja Używam:

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shareInterpolator="false" > 

    <translate 
     android:duration="@android:integer/config_mediumAnimTime" 
     android:fromYDelta="0%p" 
     android:interpolator="@android:anim/accelerate_interpolator" 
     android:toYDelta="80%p" /> 

</set> 
+1

co oznacza, że ​​twoje okno dialogowe nie zniknęło? –

+1

Okno dialogowe znika jako normalne oczekiwanie.Więc wszystko zachowuje się normalnie, z wyjątkiem tego komunikatu o błędzie, który ... nie może oznaczać czegoś dobrego. – Alin

+1

To dlatego, że przekazałeś getSupportFragmentManager() jako obiekt kontekstu ... więc zamiast tego masz pass getActivity() .... –

Odpowiedz

8

Jedynym rozwiązaniem, które działa do tej pory, bez rzucania błąd to:

@Override 
public void onAnimationEnd(Animation animation) { 
    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      dismiss(); 
     } 
    }, 10); 

}

Jestem otwarty na wszelkie inne sugestie

+1

Nie potrzebujesz opóźnienia 10 ms. Możesz po prostu użyć metody 'post()'. –

2

Masz przepustkę kontekstu fragment jako getSupportFragmentManager(). Więc trzeba go zmienić:

myDialog.show(getFragmentManager(), ""); 
+1

'void android.support.v4.app.DialogFragment.show (menedżer FragmentManager, tag String)' wymaga menedżera fragmentów, a nie działania. – Alin

+1

po zmianie na to dostaniesz właściwe rozwiązanie –

+1

Potrzebuję użyć Menedżera fragmentów pomocy, ponieważ moje aplikacje muszą być kompatybilne począwszy od Androida 2.2 – Alin

2

nie widzę żadnych takich problemów:

public class MyDIalog extends DialogFragment { 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     final Button b = new Button(getActivity()); 
     final Dialog d = super.onCreateDialog(savedInstanceState); 
     d.setContentView(b); 

     b.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       b.animate().rotationYBy(180).setDuration(500).setListener(new Animator.AnimatorListener() { 
        @Override 
        public void onAnimationStart(Animator animator) { 
        } 

        @Override 
        public void onAnimationEnd(Animator animator) { 
         dismiss(); 
        } 

        @Override 
        public void onAnimationCancel(Animator animator) { 
        } 

        @Override 
        public void onAnimationRepeat(Animator animator) { 
        } 
       }); 
      } 
     }); 

     return d; 
    } 

} 

współpracuje z:

new MyDIalog().show(getFragmentManager(),"dialog"); 

Wszelkie sposoby, można zaplanować rozmowę dismiss() nieco później za pomocą:

@Override 
public void onAnimationEnd(Animator animator) { 
    getActivity().runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     dismiss(); 
    } 
    }); 
} 
+2

Dziękuję za odpowiedź. Niestety nie działa. Jak już powiedziałem, jeśli nie używam animacji, błąd nie występuje. Różnica od twojego kodu jest taka, że ​​używam onCreateView i getSupportFragmentManger. Może jest błąd w bibliotece wsparcia? – Alin

+1

@Alin Być może, testowałem na emulatorze z platformą ICS, działało to dobrze. –

0

można używać w takim stanie.

@Override 
public void onAnimationEnd(Animation animation) { 
    Handler handler = new Handler(); 
    handler.post(new Runnable() { 
     @Override 
     public void run() { 
      dismiss(); 
     } 
    }); 
} 

tutaj, zaletą jest to, że nie określają swój własny czas, w ten sposób może pomóc utrzymać wszystko proste, jak użytkownik może zaskoczyć nawet w krótkim czasie trwania, jeżeli dialogowe przechowywane bez odwoływania po animacja się kończy.

Powiązane problemy