修改Dialog屬性後監聽不到onBackPress事件

這個問題困擾了我兩天,不過有幸在一篇博客上找到了答案。

轉自: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啦!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章