Android開發:自定義介面的Dialog,並且實現按鈕的監聽回撥
阿新 • • 發佈:2019-02-17
該專案適合想實現自定義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,就再也不用擔心了