DialogFragment 使用与友好交互

2023-11-11

Dialog顾名思义对话框,在android app是最常用的UI组成部分,以往开发基本按照设计自定义一个Dialog。某天无意间发现竟有DialogFragment这个东西,3.0后同Fragment一起更新,罪过罪过,好久没翻文档,这种好东西不知道~而且官方鼓励开发者使用DialogFragment制作Dialog。

翠花代码~~

public class TwoBtnDialogFragment extends DialogFragment {

    private OnDiagBtnClikListener mListener;

    public TwoBtnDialogFragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_two_btn_dialog, container, false);
        view.findViewById(R.id.confim_txt).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mListener.onConfimClick();
                getDialog().dismiss();
            }
        });
        view.findViewById(R.id.cacncel_txt).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mListener.onCancelClick();
                getDialog().dismiss();
            }
        });
        return view;
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mListener = (OnDiagBtnClikListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnFragmentInteractionListener");
        }
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStyle(DialogFragment.STYLE_NO_TITLE,0);

    }

    @Override
    public void onResume() {
        super.onResume();
        int width = getActivity().getWindowManager().getDefaultDisplay().getWidth() / 5 * 4;
        int height = getActivity().getWindowManager().getDefaultDisplay().getHeight() / 3;
        getDialog().getWindow().setLayout(width, height);

    }

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }

    public interface OnDiagBtnClikListener {
        // TODO: Update argument type and name
        public void onConfimClick();

        public void onCancelClick();
    }

}
没啥难度,就在onCreateView 返回一个你想要的布局样式。

用时发现问题:在布局里写宽高要不没用,要不不是定义的大小,最后在onResume里设置了宽高

 getDialog().getWindow().setLayout(width, height);

默认的DialogFragment顶部会有一个title占用的高度,实际使用不大美观可以在onCreate里

setStyle(DialogFragment.STYLE_NO_TITLE,0);

 getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE); 

去掉讨厌的title

下面可以为dialogFragment 加上进出动画,动画比较简单,就是中心点的缩放,抛砖引玉啊~

dialog_in.xml

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


    <scale
        android:interpolator="@android:anim/linear_interpolator"
        android:fromXScale="0.0"
        android:toXScale="1.0"
        android:fromYScale="0.0"
        android:toYScale="1.0"
        android:startOffset="200"
        android:duration="200"
        android:pivotX = "50%"
        android:pivotY = "50%"
        />
   <!--<translate
        android:fromYDelta="50%"
        android:toYDelta="0"
        android:startOffset="200"
        android:duration="200"
        />-->

</set>

dialog.out

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale
        android:interpolator="@android:anim/linear_interpolator"
        android:fromXScale="1.0"
        android:toXScale="0.0"
        android:fromYScale="1.0"
        android:toYScale="0.0"
        android:duration="200"
        android:pivotX = "50%"
        android:pivotY = "50%"
        />
    <!--<translate
        android:fromYDelta="0"
        android:toYDelta="50%"
        android:duration="200"
        />-->

</set>

styles.xml里加入

<style name="dilaog_anim" parent="@android:style/Animation.Activity">
        <item name="android:windowEnterAnimation">@anim/dialog_in</item>
        <item name="android:windowExitAnimation">@anim/dialog_out</item>
    </style>


万事俱备只欠五毛钱了~

fragment里:

 @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Window window = getDialog().getWindow();
        window.setWindowAnimations(R.style.dilaog_anim);
    }


哦了!看看最终的效果


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DialogFragment 使用与友好交互 的相关文章