這個問題困擾了我兩天,不過有幸在一篇博客上找到了答案。
轉自:http://blog.csdn.net/mvpsendoh/article/details/6649279
最近在做個小項目,其中有涉及到dialog的按鈕的事件處理,情形是這樣的:
在按鈕的監聽器中,我希望做一個if else 判斷,如果條件符合,就關閉對話框,如果條件不符合,就不關閉對話框,並做其他處理。
首先,默認情況下,按下dialog按鈕就會將對話框關閉。如果我們需要維持對話框,就不能讓它關閉了。比如我們要使用對話框彈出一個目錄,希望點擊對話框的按鈕時返回上層目錄。這時如果咔嚓一聲,它就把我們的對話框給關了,這就不好了。如何使它不關閉呢?
請看下面代碼:
builder.setPositiveButton("返回", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
try {
field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
field.setAccessible(true);
field.set(dialog,false);
dialog.dismiss();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//做其他處理
});
builder.show();
按照上面的try{}語句中那樣設置,就不會在按下按鈕時關閉對話框了。那如果我們想要先做個條件判斷後,再決定是否要關閉對話框呢?
大家第一時間應該會想:這還不簡單嗎?加個if else不就得了!如下:
builder.setPositiveButton("返回", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
if(!condition){
try {
field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
field.setAccessible(true);
field.set(dialog,false);
dialog.dismiss();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else {
dialog.dismiss();
}
}
});
不過遺憾的是,這樣寫雖然簡單,但是卻不起作用。這樣設置了以後,是存在的不穩定因素的。
爲什麼呢?因爲按下dialog會不會被關閉,我們可以把它當做dialog的一個屬性。我們在之前爲了使按下按鈕不關閉dialog,我們改變了它默認的屬性,正是通過下面的代碼:
field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
field.setAccessible(true);
field.set(dialog,false);
此時dialog的屬性已經改變了。如果第一次條件判斷成功,dialog屬性被修改了。而第二次條件判斷不成功,執行else語句,此時dialog的屬性已經在第一次條件判斷中被設置爲按下按鈕不關閉。那麼此時無論你調用多少次dialog的dismiss方法,他也不會把對話框關掉了。
那麼怎麼辦呢?簡單,把他的屬性改回來就行了:
builder.setPositiveButton("返回", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
if(!condition){
try {
field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
field.setAccessible(true);
field.set(dialog,false);
dialog.dismiss();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else {
try {
field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
field.setAccessible(true);
field.set(dialog,true);
dialog.dismiss();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
這樣,在else中將dialog的屬性改回來,這樣就OK啦!