DialogFragment的使用(自定义Dialog )

时间:2022-11-01 13:53:29

做翔翔财富需要自定义Dialog,查了一下发现DialogFragment很合适,貌似也是官方推荐的,而且使用起来相当方便清晰,下面我们来讲讲怎么使用DialogFragment以及我使用的时候遇到的一些问题:

一.先写一个自定义的Dialog布局,布局就是普通的xml,想怎么写就怎么写(注意整体大小),以下使用R.layout.fragment_contact_service_dialog代替

二.写一个自定义类继承DialogFragment,接下来就和普通Fragment没什么区别了

public class ContactServiceDialogFragment extends DialogFragment implements View.OnClickListener {

	//写一个静态方法产生实例
    public static ContactServiceDialogFragment newInstance() {
        ContactServiceDialogFragment csdf = new ContactServiceDialogFragment();
        return csdf;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_contact_service_dialog, container, false); //引入布局
        Button cancel = (Button) v.findViewById(R.id.cancel); //找到控件
        Button call = (Button) v.findViewById(R.id.call);
        cancel.setOnClickListener(this); //设置监听
        call.setOnClickListener(this);
        return v;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) { //此处可以设置Dialog的style等等
        super.onCreate(savedInstanceState);
        setCancelable(false);//无法直接点击外部取消dialog
        setStyle(DialogFragment.STYLE_NO_FRAME,0); //NO_FRAME就是dialog无边框,0指的是默认系统Theme
    }

    @Override
    public void onClick(View v) {  //点击事件
        switch (v.getId()) {
            case R.id.cancel:
                dismiss();
                break;
            case R.id.call:
                Toaster.showShort(getActivity(), "打电话");
                break;
            default:
                break;
        }
    }
}

三.在需要弹出Dialog的地方:

ContactServiceDialogFragment csdf = ContactServiceDialogFragment.newInstance();
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
csdf.show(ft, "contactDialog");

就这么简单,比自定义Dialog简单多了,更关键的是不会随着手机系统版本改变Dialog样式。


接下来谈谈遇到的一些问题和解决方法:

1.如果需要无法直接点击外部取消Dialog:

onCreate中:
setCancelable(false);//无法直接点击外部取消dialog
但这样做连点击返回键都无法将Dialog取消,显然不好,那就需要在
onCreateView中加上监听返回键的代码:
this.getDialog().setOnKeyListener(new DialogInterface.OnKeyListener() {
        	    public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
        	        if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
        	            ContactServiceDialogFragment.this.dismiss();
        	            return true; // pretend we've processed it
         	       } else
         	           return false; // pass on to be processed as normal
        	    }
   	     });

2.DialogFragment背景不变暗
如果我们定义了整个项目的style,有可能就会遇到DialogFragment背景不变暗的情况,这时只需要为DialogFragment设置style就好了
在自定义DialogFragement的onCreate中:
setStyle(DialogFragment.STYLE_NO_FRAME, R.style.Theme_Dialog_Fragment);
在themes.xml文件中加上:

<style name="Theme_Dialog_Fragment" parent="android:style/Theme.Dialog">
        <item name="android:backgroundDimEnabled">true</item> //背景变暗
</style>


3.DialogFragment黑边或者白边问题

弹出的dialog虽然是自定义样式,但边框会有黑边或者白边,解决方法:

在自定义DialogFragement的onCreateView方法中:

this.getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); //设置dialog的背景为透明