Я пытаюсь установить переходы ввода и выхода для DialogFragment, который кажется достаточно прямым. Вот код из моего DrinkDetailActivity, который создает диалог:
fab.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { //create and display the dialog DialogFragment orderFragment = new OrderDrinkDialogFragment(); //set the slide transition for the fragment Transition dialSlide = new Slide(); dialSlide.setDuration(300); orderFragment.setEnterTransition(dialSlide); orderFragment.setExitTransition(dialSlide); orderFragment.show(getFragmentManager(), "order"); } });
И вот код из моего класса OrderDrinkDialogFragment:
public class OrderDrinkDialogFragment extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(DrinkDetailActivity.activity); //set up the Linear Layout of the dialog LinearLayout layout = new LinearLayout(DrinkDetailActivity.activity); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); layout.setOrientation(LinearLayout.VERTICAL); layout.setLayoutParams(params); //set up the EditText view EditText nameField = new EditText(DrinkDetailActivity.activity); nameField.setHint(R.string.dialog_name_hint); //add the EditText view to the layout layout.addView(nameField, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); //set layout as the view of the dialog builder.setView(layout); return builder.create(); } }
DrinkDetailActivity.activity
– this
просто this
из экземпляра DrinkDetailActivity
. По какой-то причине диалог не переходит, когда я show()
его или когда он отклоняется, он просто появляется и выходит из вида. Этот урок помог мне разобраться в переходах активности для остальной части моего приложения, и я следил за теми же инструкциями для переходов фрагментов, как он говорит. Что я делаю не так?
Это сработало для меня. Моя анимация слайдов
<?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>
И моя анимация слайдов
<?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>
Теперь, наконец, в вашем onCreateDialog()
фрагмента Dialog добавьте это
public Dialog onCreateDialog(Bundle savedInstanceState) { final Dialog dialog = super.onCreateDialog(savedInstanceState); dialog.getWindow().getAttributes().windowAnimations = R.style.DialogAnimation; return dialog; }
Вам нужно написать стиль для показа анимации в любом окне, например Dialog
<style name="AnimDialog" parent="@android:style/Theme.Dialog"> <item name="android:windowAnimationStyle">@style/DialogAnimation</item> </style> <style name="DialogAnimation"> <item name="android:windowEnterAnimation">@anim/fadein</item> <item name="android:windowExitAnimation">@anim/fadeout</item> </style>
Для вашего диалога вам нужно создать экземпляр, например
Dialog animatedDialog = new Dialog(MainActivity.this,R.style.AnimDialog);
DialogFragment – это не только диалоговое окно, но и фрагмент. Подробнее о том, как его использовать, см. В разделе « Основной диалог» . Вы использовали onCreateDialog внутри фрагмента, который может быть причиной вашей проблемы. Таким образом, используйте onCreateView для создания диалогового окна фрагмента.
Надеюсь, этот ответ вам поможет.