Измените переход на ввод / выезд DialogFragment как раз перед увольнением

У меня есть DialogFragment, и я установил анимацию для ввода / выхода в методе onActivityCreated, как показано ниже.

@Override public void onActivityCreated(Bundle arg0) { super.onActivityCreated(arg0); getDialog().getWindow() .getAttributes().windowAnimations = R.style.DialogAnimation; } 

Мои файлы стиля DialogAnimation выглядят следующим образом

 <style name="DialogAnimation"> <item name="android:windowEnterAnimation">@android:anim/fade_in</item> <item name="android:windowExitAnimation">@android:anim/fade_out</item> </style> 

Это работает для меня сейчас …

Теперь моя проблема в том, что я хочу иметь две разные анимации выхода, когда нажата кнопка «ОК», и одна для кнопки «Отмена». Так что я сделал, я попытался изменить переход непосредственно перед увольнением, но он не работал. О том, как это может быть достигнуто … Это то, что я пробовал.

  @Override public void onClick(View v) { getDialog().getWindow() .getAttributes().windowAnimations = R.style.DialogAnimation2; this.dismiss(); } 

Solutions Collecting From Web of "Измените переход на ввод / выезд DialogFragment как раз перед увольнением"

Вы можете сделать это внутри своего диалогового окна, не меняя

 getDialog().getWindow() .getAttributes().windowAnimations 

Вы должны оживить «декор» в onStart и onClick.

Это код:

Сначала создать диалог

 @Override public Dialog onCreateDialog(Bundle savedInstanceState) { return new AlertDialog.Builder(getActivity()) .setTitle("Hello from animated dialog :)") .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { //we have to add button here and then override it's click in onStart } } ) .setCancelable(false) .create(); } 

Затем переопределите метод onStart

 @Override public void onStart() { super.onStart(); AlertDialog dialog = (AlertDialog)getDialog(); final View decorView = getDialog() .getWindow() .getDecorView(); ObjectAnimator scaleDown = ObjectAnimator.ofPropertyValuesHolder(decorView, PropertyValuesHolder.ofFloat("scaleX", 0.0f, 1.0f), PropertyValuesHolder.ofFloat("scaleY", 0.0f, 1.0f), PropertyValuesHolder.ofFloat("alpha", 0.0f, 1.0f)); scaleDown.setDuration(2000); scaleDown.start(); Button positiveButton = dialog.getButton(Dialog.BUTTON_NEGATIVE); positiveButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final View decorView = getDialog() .getWindow() .getDecorView(); ObjectAnimator scaleDown = ObjectAnimator.ofPropertyValuesHolder(decorView, PropertyValuesHolder.ofFloat("scaleX", 1.0f, 0.0f), PropertyValuesHolder.ofFloat("scaleY", 1.0f, 0.0f), PropertyValuesHolder.ofFloat("alpha", 1.0f, 0.0f)); scaleDown.addListener(new Animator.AnimatorListener() { @Override public void onAnimationEnd(Animator animation) { dismiss(); } @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } }); scaleDown.setDuration(2000); scaleDown.start(); } }); } 

Вот результат анимации

Демонстрация результата


И если вы удалите свойства шкалы из моего кода, вы получите только альфа-анимацию. Именно так, как вы хотели.

Удали это:

 PropertyValuesHolder.ofFloat("scaleX", 1.0f, 0.0f), PropertyValuesHolder.ofFloat("scaleY", 1.0f, 0.0f), 

Вы можете настроить анимацию Up down для фрагмента диалога.

// Слайд анимации

 <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:duration="@android:integer/config_mediumAnimTime" android:fromYDelta="100%" android:interpolator="@android:anim/accelerate_interpolator" android:toXDelta="0" /> </set> 

// Слайд анимации dowm

 <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:duration="@android:integer/config_mediumAnimTime" android:fromYDelta="0%p" android:interpolator="@android:anim/accelerate_interpolator" android:toYDelta="100%p" /> </set> 

// Стиль

 <style name="DialogAnimation"> <item name="android:windowEnterAnimation">@anim/slide_up</item> <item name="android:windowExitAnimation">@anim/slide_down</item> </style> 

// Внутренний фрагмент диалога

 @Override public void onActivityCreated(Bundle arg0) { super.onActivityCreated(arg0); getDialog().getWindow() .getAttributes().windowAnimations = R.style.DialogAnimation; } 

Один простой способ сделать то, что вы хотите, это использовать анимационные прослушиватели.

  animation.setAnimationListener(new AnimationListener() { @Override public void onAnimationStart(Animation animation) { // TODO Auto-generated method stub } @Override public void onAnimationRepeat(Animation animation) { // TODO Auto-generated method stub } @Override public void onAnimationEnd(Animation animation) { // TODO Auto-generated method stub // dismiss your dialog in here and it will work } }); 

Начните анимацию по методу onclick и откройте диалог onAnimationEnd (). Вам может потребоваться создание объектов snimm и запустить их вручную с помощью метода startAnimation (анимации) View.

Я думаю, что лучший подход – это назвать разные анимации при нажатии кнопки. Следовательно, у вас будет нечто похожее на нижеследующее:

  protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button OkButton = (Button) findViewById(R.id.btnOk); Button CancelButton = (Button) findViewById(R.id.btnCancel); OkButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { getDialog().getWindow().getAttributes().windowAnimations = R.style.DialogAnimation; } }); return true; CancelButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { getDialog().getWindow().getAttributes().windowAnimations = R.style.DialogAnimation2; } }); return true; } 

Если бы я был вами, я бы также использовал правильные соглашения об именах для дальнейшего использования. Например, установите DialogAnimation на OkAnimation и DialogAnimation2 на CancelAnimation.

Домой это помогает 🙂

Вы должны установить тему для своего базового диалога

Скажем: –

 public class CustomDialogFragment extends DialogFragment implements OnEditorActionListener { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return super.onCreateView(inflater, container, savedInstanceState); } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // Set a theme on the dialog builder constructor! AlertDialog.Builder builder = new AlertDialog.Builder( getActivity(), R.style.MyCustomTheme ); builder .setTitle( "Your title" ) .setMessage( "Your message" ) .setPositiveButton( "OK" , new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dismiss(); } }); return builder.create(); } } 

Тогда вам просто нужно определить тему, которая будет включать в себя вашу желаемую анимацию. В styles.xml добавьте свою тему:

 <style name="MyCustomTheme" parent="@android:style/Theme.Panel"> <item name="android:windowAnimationStyle">@style/MyAnimation.Window</item> </style> <style name="MyAnimation.Window" parent="@android:style/Animation.Activity"> <item name="android:windowEnterAnimation">@anim/anim_in</item> <item name="android:windowExitAnimation">@anim/anim_out</item> </style> 

Обратитесь к этому