天天看點

Android 4.0設定Dialog點選螢幕不消失

業務的需求是變化莫測的,最近就遇到一個需求是——使用者隻有點選dialog的取消按鈕才會消失,點選螢幕的時候不消失。android ics對ui做了很大的變動,系統提倡使用dialogfragment,但是系統預設的操作習慣是點選螢幕dialog會自動消失。

為了實作業務的需求,想過使用dialog風格的activity,但是做出來的效果和系統的ui效果不比對,最終隻有失敗告終。在黔驢技窮的時候,決定再仔細撸一下android文檔,終于在文檔中發現了dialog的setcanceledontouchoutside屬性,具體使用如下:

方法一:

[java] view

plaincopy

public class myalertdialogfragment extends dialogfragment {  

    public static myalertdialogfragment newinstance(int title) {  

        myalertdialogfragment frag = new myalertdialogfragment();  

        bundle args = new bundle();  

        args.putint("title", title);  

        frag.setarguments(args);  

        return frag;  

    }  

    @targetapi(11)  

    @override  

    public dialog oncreatedialog(bundle savedinstancestate) {  

        int title = getarguments().getint("title");  

        alertdialog dialog = new alertdialog.builder(getactivity())  

        .seticon(r.drawable.ic_launcher)  

        .settitle(title)  

        .setpositivebutton(r.string.alert_dialog_ok,  

            new dialoginterface.onclicklistener() {  

                public void onclick(dialoginterface dialog, int whichbutton) {  

                    ((mainactivity)getactivity()).dopositiveclick();  

                }  

            }  

        )  

        .setnegativebutton(r.string.alert_dialog_cancel,  

                    ((mainactivity)getactivity()).donegativeclick();  

        .create();  

        dialog.setcanceledontouchoutside(false);// 設定點選螢幕dialog不消失  

        return dialog;  

}  

方法二:

在oncreate()方法中設定dialog點選螢幕不可取消,執行個體代碼如下:

@override      

 public void oncreate(bundle icicle)  

 {  

    super.oncreate(icicle);  

    this.setcancelable(false);// 設定點選螢幕dialog不消失  

     int style = dialogfragment.style_normal, theme = 0;  

     setstyle(style,theme);  

 }  

(提示:提醒大家一下在覆寫了oncreatedialog()方法後,就不能覆寫oncreateview()方法了)

說到這兒就給大家介紹一下建立dialogfragment的第二種方式吧,第一種方式上面已經叙述了,在此就不再叙述了,直接看第二種實作的具體方式,具體代碼如下所示:

import android.app.activity;  

import android.app.dialogfragment;  

import android.app.fragmenttransaction;  

import android.content.dialoginterface;  

import android.os.bundle;  

import android.util.log;  

import android.view.layoutinflater;  

import android.view.view;  

import android.view.viewgroup;  

import android.widget.button;  

import android.widget.edittext;  

import android.widget.textview;  

public class promptdialogfragment   

extends dialogfragment   

implements view.onclicklistener  

{  

    private edittext et;  

    public static promptdialogfragment  

    newinstance(string prompt)  

    {  

        promptdialogfragment pdf = new promptdialogfragment();  

        bundle bundle = new bundle();  

        bundle.putstring("prompt",prompt);  

        pdf.setarguments(bundle);  

        return pdf;  

    public void onattach(activity act) {  

        // if the activity we're being attached to has  

        // not implemented the ondialogdonelistener  

        // interface, the following line will throw a  

        // classcastexception. this is the earliest we  

        // can test if we have a well-behaved activity.  

        ondialogdonelistener test = (ondialogdonelistener)act;  

        super.onattach(act);  

    @override      

    public void oncreate(bundle icicle)  

        super.oncreate(icicle);  

        this.setcancelable(true);  

        int style = dialogfragment.style_normal, theme = 0;  

        setstyle(style,theme);  

    //  覆寫oncreateview()方法,實作dialogfragment的布局。注意不能同時覆寫 oncreateview()和oncreatedialog()方法  

    public view oncreateview(layoutinflater inflater,              

            viewgroup container,   

            bundle icicle)  

        view v = inflater.inflate(  

                r.layout.prompt_dialog, container, false);  

        textview tv = (textview)v.findviewbyid(  

                                   r.id.promptmessage);  

        tv.settext(getarguments().getstring("prompt"));  

        button dismissbtn = (button)v.findviewbyid(  

                                       r.id.btn_dismiss);  

        dismissbtn.setonclicklistener(this);  

        button savebtn = (button)v.findviewbyid(  

                                    r.id.btn_save);  

        savebtn.setonclicklistener(this);  

        button helpbtn = (button)v.findviewbyid(  

                r.id.btn_help);  

        helpbtn.setonclicklistener(this);  

        et = (edittext)v.findviewbyid(r.id.inputtext);  

        if(icicle != null)  

            et.settext(icicle.getcharsequence("input"));  

        return v;  

    public void onsaveinstancestate(bundle icicle) {  

        icicle.putcharsequence("input", et.gettext());  

        super.onpause();  

    public void oncancel(dialoginterface di) {  

        log.v(mainactivity.logtag, "in oncancel() of pdf");  

        super.oncancel(di);  

    public void ondismiss(dialoginterface di) {  

        log.v(mainactivity.logtag, "in ondismiss() of pdf");  

        super.ondismiss(di);  

    public void onclick(view v)   

        ondialogdonelistener act = (ondialogdonelistener)getactivity();  

        if (v.getid() == r.id.btn_save)  

        {  

            textview tv = (textview)getview().findviewbyid(r.id.inputtext);  

            act.ondialogdone(this.gettag(), false, tv.gettext());  

            dismiss();  

            return;  

        }  

        if (v.getid() == r.id.btn_dismiss)  

            act.ondialogdone(this.gettag(), true, null);  

        if (v.getid() == r.id.btn_help)  

            fragmenttransaction ft = getfragmentmanager().begintransaction();  

            ft.remove(this);  

            // in this case, we want to show the help text, but  

            // come back to the previous dialog when we're done  

            ft.addtobackstack(null);  

            //null represents no name for the back stack transaction  

            helpdialogfragment hdf =  

                    helpdialogfragment.newinstance(r.string.help1);  

            hdf.show(ft, mainactivity.help_dialog_tag);  

代碼比較簡單,注釋已經寫明白了,相信大家都能看懂的! 

以上隻是設定dialog的一個小技巧以及建立dialogfragment的兩種建立方式,希望對大家有所幫助

繼續閱讀