做翔翔财富需要自定义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);
<style name="Theme_Dialog_Fragment" parent="android:style/Theme.Dialog"> <item name="android:backgroundDimEnabled">true</item> //背景变暗 </style>
弹出的dialog虽然是自定义样式,但边框会有黑边或者白边,解决方法:
在自定义DialogFragement的onCreateView方法中:
this.getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); //设置dialog的背景为透明