Android开发:自定义界面的Dialog,并且实现按钮的监听回调

该项目适合想实现自定义dialog,有懒得折腾的人。

在安卓开发的时候,往往会碰到一些特别漂亮的dialog,比如这个图片的:

Android开发:自定义界面的Dialog,并且实现按钮的监听回调_第1张图片


很多这种类型的dialog,界面千变万化,于是我建立了一个通用自定义dialog,可以实现以下功能:

1、界面的自定义,全部自己用xml定义界面;

2、不管是在Fragment,还是Activity都可以实例化该dialog,并且实现dialog按钮的监听回调;

3、在dialog按钮点击后,自动消失。


当然,先看下效果图:

Android开发:自定义界面的Dialog,并且实现按钮的监听回调_第2张图片


界面很丑,因为不同的项目,对于界面的需求会不同,完全可以通过xml自定义,所以界面就没有做优化了,但是功能杠杆的,适合想实现自定义dialog,有懒得折腾的人;


好,首先附上自定义dialog的代码,由于代码比较简单,我就全部附上来了


public class MyDialogFragment extends DialogFragment{
	private int mNum;
	private OnDialogButtonClickListener buttonClickListner;
	
	static MyDialogFragment newInstance(int num) {
        MyDialogFragment f = new MyDialogFragment();

        Bundle args = new Bundle();
        args.putInt("num", num);
        f.setArguments(args);

        return f;
    }
	
	//实现回调功能
	public interface OnDialogButtonClickListener {
		public void okButtonClick();
		public void cancelButtonClick();
		
	}
	
	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        mNum = getArguments().getInt("num");

        int style = DialogFragment.STYLE_NORMAL, theme = 0;
        switch (2) {
            case 1: style = DialogFragment.STYLE_NO_TITLE; break;
            case 2: style = DialogFragment.STYLE_NO_FRAME; break;
            case 3: style = DialogFragment.STYLE_NO_INPUT; break;
            case 4: style = DialogFragment.STYLE_NORMAL; break;
            case 5: style = DialogFragment.STYLE_NORMAL; break;
            case 6: style = DialogFragment.STYLE_NO_TITLE; break;
            case 7: style = DialogFragment.STYLE_NO_FRAME; break;
            case 8: style = DialogFragment.STYLE_NORMAL; break;
        }
        switch (5) {
            case 4: theme = android.R.style.Theme_Holo; break;
            case 5: theme = android.R.style.Theme_Holo_Light_Dialog; break;
            case 6: theme = android.R.style.Theme_Holo_Light; break;
            case 7: theme = android.R.style.Theme_Holo_Light_Panel; break;
            case 8: theme = android.R.style.Theme_Holo_Light; break;
        }
        setStyle(style, theme);
    }
	
	@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_dialog, container, false);
        Button button = (Button)v.findViewById(R.id.btn_ok);
        button.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
            	buttonClickListner.okButtonClick();
            	getDialog().dismiss();
            }
        });
        
        v.findViewById(R.id.btn_cancel).setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				buttonClickListner.cancelButtonClick();
				getDialog().dismiss();
			}
		});

        return v;
    }
	
	public void setOnButtonClickListener(OnDialogButtonClickListener listener) {
		this.buttonClickListner = listener;
	}
}

里面有一些多余的代码,比如newInstance先留着,难免以后用得到,代码中是继承了dialogfragment,然后自定义layout,用interface实现按钮的点击监听,获取点击事件的代码如下:

MyDialogFragment newFragment = MyDialogFragment.newInstance(mStackLevel);
	    newFragment.show(ft, "dialog");
	    
	    newFragment.setOnButtonClickListener(new OnDialogButtonClickListener() {
			
			@Override
			public void okButtonClick() {
				Log.i("debug", "ok button click");
			}

			@Override
			public void cancelButtonClick() {
				Log.i("debug", "cancel button click");
			}
		});


这样的话,既可以自定义dialog,有可以获取dialog的点击事件,以后再碰到特殊界面的dialog,就再也不用担心了


源代码

你可能感兴趣的:(Android开发,Andro)