Fragment实现的自定义Dialog

       在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);
        }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章