業務的需求是變化莫測的,最近就遇到一個需求是——使用者隻有點選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的兩種建立方式,希望對大家有所幫助