设置Android片段进入和退出转换?

9

我正在尝试为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 指的是在 DrinkDetailActivity 实例内部的 this。但出现了一个问题,当我使用 show() 或者关闭对话框时,它并没有过渡效果,只是简单地弹入和弹出视图。这篇教程帮助我解决了应用程序中其余部分的 Activity 过渡问题,我也按照相同的说明进行了 Fragment 过渡。请问我做错了什么?
3个回答

10

这对我有用。我的向上滑动动画是:

<?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()中添加以下内容

public Dialog onCreateDialog(Bundle savedInstanceState) 
{
    final Dialog dialog = super.onCreateDialog(savedInstanceState);
    dialog.getWindow().getAttributes().windowAnimations = R.style.DialogAnimation;
    return dialog;
}

如果我这样做,就会出现以下错误:java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window android.app.Dialog.getWindow()' on a null object reference。这很有道理,因为在对话框创建之前,我怎么能获取对话框的窗口呢? - mithunm93
这个可以工作!只需要做一些更改:1)在向上滑动的动画中,将“toXDelta”更改为“toYDelta”,2)在向上滑动的动画中,将“100%”和“0”分别更改为“100%p”和“0%p”,以及3)我只是做了一个Dialog dialog = builder.create();而不是调用super。非常感谢您的帮助!不确定是否应该在这里问,但是如何让对话框从底部导航栏下面滑出呢? - mithunm93
尝试像这样做:https://dev59.com/kn_aa4cB1Zd3GeqP3XR0 - williamj949
那个线程更多是关于隐藏导航栏,我希望我的导航栏仍然存在,但我希望对话框看起来像是从其下面滑出来的。我会进一步研究并可能发布新帖子,如果我无法解决它,非常感谢您的帮助! - mithunm93

0

你需要编写一个样式,以在任何窗口上显示动画,如对话框

<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);

-1

DialogFragment 不仅是一个对话框,还是一个片段,请参阅基本对话框以获取有关如何使用它的更多详细信息。您已在片段内使用了 onCreateDialog,这可能是您问题的原因。因此,请使用 onCreateView 来创建您的片段对话框视图。

希望这个答案能帮到您。


3
答案错误,请查看此处的警报对话框部分:http://developer.android.com/reference/android/app/DialogFragment.html - Lei Guo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接