在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);
}