在android開發中,Dialog時經常用到的,特別是自定義的Dialog,知道如何使用時很重要的.下面來看看如何實現.
最近開發照相機時候需要用到一個dialog,如下效果:
當點擊菜單項"語音拍照"時候,就會彈出這個彈出框,點擊這個彈出框的一個菜單項就會播放對應的聲音:點擊"茄子",就會聽到播放茄子的聲音.
在activity中,實現一個Dialog,我們可以從寫activity中的方法:public Dialog onCreateDialog(int dialogId),這裏的dialogId標識了我們這一次需要顯示的Dialog.當然需要顯示那一個Dialog在你的activity中調用這個方法:showDialog(DIALOG_ID_VOICE_COMMAND_SHOW_TONES);如果這個Dialog沒有創建,就會自動回調onCreateDialog來創建我們的Dialog來顯示.看看如下的實現方式:
public void VoiceCommandClickListener(View v) {
long startTime = System.nanoTime();
showDialog(DIALOG_ID_VOICE_COMMAND_SHOW_TONES);
/*
FragmentTransaction ft = getFragmentManager().beginTransaction();
VoiceCommandDialogFragment prev =(VoiceCommandDialogFragment) Fragment.instantiate(v.getContext(), VoiceCommandDialogFragment.class.getName());
prev.show(ft, "voice_dialog");
*/
long consumingTime = System.nanoTime() - startTime;
Log.d("yu_camera", "VoiceCommandClickListener consumingTime="+consumingTime);
}
@Override
public Dialog onCreateDialog(int dialogId) {
if(dialogId == DIALOG_ID_VOICE_COMMAND_SHOW_TONES){
Log.d("yu_camera", "onCreateDialog ");
Dialog dialog = new Dialog(this, R.style.transparent_dialog_them);
dialog.setContentView(R.layout.setting_switch_sublist_layout);
VoiceManager voice_manager = ((CameraApp)PhotoPreferenceActivity.this.getApplication()).getVoiceManager();
SettingSwitchSublistLayout mVoiceSettingLayout =(SettingSwitchSublistLayout) dialog.findViewById(R.id.SettingSwitchSublistLayout_ID);
mVoiceSettingLayout.initialize(voice_manager.getVoiceEntryValues());
mVoiceSettingLayout.setSettingChangedListener(this);
dialog.getWindow().setCloseOnTouchOutside(true);
dialog.setCanceledOnTouchOutside(true);
return dialog;
}
return super.onCreateDialog(dialogId);
}
其實實現起來很方便,主要是我們的activity可以幫我們管理需要顯示的Dialog,所以只需要從寫onCreateDialog,顯示的時候調用showDialog就可以來.
不過問題來啦: 打開Activity.java去查看一下activity中對showDialog這個方法的說明,你就會發現,其實現在同樣的情況時推薦使用DialogFragment來實現了.
* <em>If you are targeting {@link android.os.Build.VERSION_CODES#HONEYCOMB}
* or later, consider instead using a {@link DialogFragment} instead.</em>
看了上面的說明,我們就不得不優先使用 DialogFragment了.其實這就跟使用Fragment一樣.把上面使用DialogFragment的註釋代碼打開後VoiceCommandClickListener方法變爲如下:
public void VoiceCommandClickListener(View v) {
long startTime = System.nanoTime();
//showDialog(DIALOG_ID_VOICE_COMMAND_SHOW_TONES);
FragmentTransaction ft = getFragmentManager().beginTransaction();
VoiceCommandDialogFragment prev =(VoiceCommandDialogFragment) Fragment.instantiate(v.getContext(), VoiceCommandDialogFragment.class.getName());
prev.show(ft, "voice_dialog");
long consumingTime = System.nanoTime() - startTime;
Log.d("yu_camera", "VoiceCommandClickListener consumingTime="+consumingTime);
}
這裏要說明一下,從android HONEYCOMB開始後面的activity都支持Fragment,實際上activity主要是通過FragmentManager來管理的.這裏需要說明兩點:
(1)對於Fragment的使用,一般都是通過FragmentTransaction來處理的.FragmentTransaction其實是使用者和FragmentManager的橋樑.
(2)對於Fragment的實例化,一般採用Fragment的靜態方法instantiate來實現.
對於VoiceCommandDialogFragment主要是從寫他的onCreateView來確定顯示的內容:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.setting_switch_sublist_layout, container, false);
VoiceManager voice_manager = ((CameraApp)getActivity().getApplication()).getVoiceManager();
SettingSwitchSublistLayout mVoiceSettingLayout =(SettingSwitchSublistLayout) v.findViewById(R.id.SettingSwitchSublistLayout_ID);
mVoiceSettingLayout.initialize(voice_manager.getVoiceEntryValues());
mVoiceSettingLayout.setSettingChangedListener((PhotoPreferenceActivity)getActivity());
return v;
}
然後,在VoiceCommandDialogFragment的onCreate中可以指定器主題的配置:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Pick a style based on the num.
int style = DialogFragment.STYLE_NO_TITLE, theme = R.style.transparent_dialog_them;
setStyle(style, theme);
}