进入和退出动画在Dialog Fragment中不起作用

时间:2017-01-26 08:23:28

标签: android

我已经检查了流量q / a上的所有堆栈,仍然无法找到解决方案。

以下是文件:

DialogFragment.java

package app.com.thetechnocafe.mealsquickie.Dialogs;

import android.app.Dialog;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.TextInputEditText;
import android.support.design.widget.TextInputLayout;
import android.support.v4.app.DialogFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Toast;

import app.com.thetechnocafe.mealsquickie.R;
import butterknife.BindView;
import butterknife.ButterKnife;

/**
 * Created by gurleensethi on 26/01/17.
 */

public class NewCategoryDialog extends DialogFragment {

    @BindView(R.id.category_name_text_input_layout)
    TextInputLayout mCategoryNameTextInputLayout;
    @BindView(R.id.category_name_text_input_edit_text)
    TextInputEditText mCategoryNameTextInputEditText;
    @BindView(R.id.cancel_button)
    Button mCancelButton;
    @BindView(R.id.add_button)
    Button mAddButton;

    private OnAddCategoryListener mListener;

    //Interface for callbacks
    public interface OnAddCategoryListener {
        void onCategoryAdded(String category);
    }

    //Instance method
    public static NewCategoryDialog getInstance() {
        return new NewCategoryDialog();
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        //Inflate the custom dialog
        View root = LayoutInflater.from(getContext()).inflate(R.layout.dialog_new_category, container, false);

        ButterKnife.bind(this, root);

        setEventListeners();

        //Set properties
        getDialog().requestWindowFeature(STYLE_NO_TITLE);
        setCancelable(false);

        return root;
    }

    @Override
    public void onStart() {
        super.onStart();
        getDialog().getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    }

    private void setEventListeners() {
        mCancelButton.setOnClickListener(view -> getDialog().dismiss());

        mAddButton.setOnClickListener(view -> validateAndSubmitFields());
    }

    private void validateAndSubmitFields() {
        if (mListener != null) {
            //Remove all the already existing errors
            mCategoryNameTextInputLayout.setErrorEnabled(false);

            String category = mCategoryNameTextInputEditText.getText().toString();

            if (category.equals("")) {
                mCategoryNameTextInputLayout.setError(getString(R.string.category_name_cannot_be_empty));
                return;
            }

            mListener.onCategoryAdded(category);
        } else {
            Toast.makeText(getContext(), "No Listener attached for adding new category. Please contact the developer.", Toast.LENGTH_SHORT).show();
        }
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Dialog dialog = super.onCreateDialog(savedInstanceState);

        dialog.getWindow().getAttributes().windowAnimations = R.style.DialogSlideFromBottomAnimation;
        return dialog;
    }
}

slide_down.xml

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

slide_up.xml

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

显示对话框:

DialogFragment dialog = NewCategoryDialog.getInstance();
dialog.show(getFragmentManager(), DIALOG_NEW_CATEGORY_TAG);

我已尝试过getAttributes().windowAnimationssetWindowAnimations(),并尝试将其放入onActivityCreated,onCreateDialog,onCreateView,但它似乎无效。

5 个答案:

答案 0 :(得分:1)

试试这个。

@Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        if (getDialog().getWindow() != null) {
            dialog.getWindow().getAttributes().windowAnimations = R.style.DialogSlideFromBottomAnimation;
        }
    }

答案 1 :(得分:1)

在您的onStart片段中, 请执行以下操作:

  // safety check
  if (getDialog() == null) {
    return;
  }

  // set the animations to use on showing and hiding the dialog
  getDialog().getWindow().setWindowAnimations(
      R.style.dialog_animation_slide);

上面设置的样式应定义为:


<style
  name="dialog_animation_slide" >
  <item name="android:windowEnterAnimation">@anim/slide_up</item>
  <item name="android:windowExitAnimation">@anim/slid_down</item>
</style>

请确保将slide_up.xmlslide_down.xml放在res/anim目录中

请从dialog.getWindow().getAttributes().windowAnimations = R.style.DialogSlideFromBottomAnimation;中删除onCreateDialog()

让我知道这是否适合您!

答案 2 :(得分:1)

无论您选择哪种解决方案,您都可能遇到与我相同的问题。

在安装新版本之前,我需要从我的开发设备上卸载游戏,以使更改生效。

我不知道为什么,但我猜这与 Android Studio 上的优化部署没有识别更改有关。

答案 3 :(得分:0)

如果没有任何效果,则可能是设备的动画已从开发人员选项中停用。恢复默认选项并检查。

答案 4 :(得分:0)

动画对于 DialogFragment 来说有点棘手。

当您需要更改布局中视图的可见性或位置时,应添加细微的动画以帮助用户了解UI的变化。

因此,要实现此目的,请记住 DialogFragment Dialog 类的包装,您应将主题设置为基础 Dialog < / strong>以获取所需的动画:

public class CustomDialogFragment extends DialogFragment
{
@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 中添加您的自定义主题:

slide_down.xml

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

slide_up.xml

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

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/slide_down</item>
    <item name="android:windowExitAnimation">@anim/slide_up</item>
</style>    

仅此而已...希望对您有所帮助。这要感谢以下答案:Show DialogFragment with animation growing from a point