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