1. 程式人生 > >Android開發:自定義介面的Dialog,並且實現按鈕的監聽回撥

Android開發:自定義介面的Dialog,並且實現按鈕的監聽回撥

該專案適合想實現自定義dialog,有懶得折騰的人。

在安卓開發的時候,往往會碰到一些特別漂亮的dialog,比如這個圖片的:


很多這種型別的dialog,介面千變萬化,於是我建立了一個通用自定義dialog,可以實現以下功能:

1、介面的自定義,全部自己用xml定義介面;

2、不管是在Fragment,還是Activity都可以例項化該dialog,並且實現dialog按鈕的監聽回撥;

3、在dialog按鈕點選後,自動消失。

當然,先看下效果圖:


介面很醜,因為不同的專案,對於介面的需求會不同,完全可以通過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,就再也不用擔心了

原始碼