2012-03-30 151 views
0

我想在整個應用程序中輕鬆顯示自定義樣式的彈出窗口。 對於我Utils類我創造了這個靜態方法:正確關閉自定義對話框

public static Dialog showStyledPopup(Context context, String sHeader, String sMessage, 
      String sBtn0Text, View.OnClickListener onClick0, 
      String sBtn1Text, View.OnClickListener onClick1, 
      String sBtn2Text, View.OnClickListener onClick2) 
    { 
     Dialog dialog = new Dialog(context, R.style.dialog_style_no_bg); 
     dialog.setContentView(R.layout.popup); 
     dialog.setCancelable(false); 
     TextView txtHeader = (TextView)dialog.findViewById(R.id.txt_popup_header); 
     if (null == sHeader) 
     { 
      txtHeader.setVisibility(View.GONE); 
     } 
     else 
     { 
      txtHeader.setText(sHeader); 
      txtHeader.setTypeface(App.fontHeader); 
     } 
     TextView txtMessage = (TextView)dialog.findViewById(R.id.txt_popup_message); 
     txtMessage.setText(sMessage); 
     txtMessage.setTypeface(App.fontCommon); 
     Button btn0 = (Button)dialog.findViewById(R.id.btn_popup_0); 
     btn0.setVisibility(View.VISIBLE); 
     btn0.setText(sBtn0Text); 
     btn0.setTypeface(App.fontCommon); 
     btn0.setOnClickListener(onClick0); 
     if (null != onClick1) 
     { 
      Button btn1 = (Button)dialog.findViewById(R.id.btn_popup_1); 
      btn1.setVisibility(View.VISIBLE); 
      btn1.setText(sBtn1Text); 
      btn1.setTypeface(App.fontCommon); 
      btn1.setOnClickListener(onClick1); 
     } 
     if (null != onClick2) 
     { 
      Button btn2 = (Button)dialog.findViewById(R.id.btn_popup_2); 
      btn2.setVisibility(View.VISIBLE); 
      btn2.setText(sBtn2Text); 
      btn2.setTypeface(App.fontCommon); 
      btn2.setOnClickListener(onClick2); 
     } 
     dialog.show(); 
     return dialog; 
    } 

popup.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="250dp" 
    android:layout_height="170dp" 
    android:background="@drawable/dialog_250_170" 
    android:gravity="center_horizontal" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/txt_popup_header" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="15dp" 
     android:textColor="@android:color/black" 
     android:textSize="20dp" /> 

    <LinearLayout 
     android:id="@+id/group_popup_btns" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:layout_alignParentBottom="true" 
     android:layout_marginBottom="10dp" 
     android:orientation="horizontal" 
     android:baselineAligned="false" > 

     <Button 
      android:id="@+id/btn_popup_0" 
      android:layout_width="60dp" 
      android:layout_height="40dp" 
      android:background="@drawable/btn_60_40" 
      android:textColor="@android:color/black" 
      android:textSize="20dp" /> 

     <Button 
      android:id="@+id/btn_popup_1" 
      android:layout_width="60dp" 
      android:layout_height="40dp" 
      android:layout_marginLeft="5dp" 
      android:background="@drawable/btn_60_40" 
      android:textColor="@android:color/black" 
      android:textSize="20dp" 
      android:visibility="gone" /> 

     <Button 
      android:id="@+id/btn_popup_2" 
      android:layout_width="60dp" 
      android:layout_height="40dp" 
      android:layout_marginLeft="5dp" 
      android:background="@drawable/btn_60_40" 
      android:textColor="@android:color/black" 
      android:textSize="20dp" 
      android:visibility="gone" /> 
    </LinearLayout> 
    <RelativeLayout 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_above="@id/group_popup_btns" 
     android:layout_below="@id/txt_popup_header" 
     android:layout_marginLeft="20dp" 
     android:layout_marginRight="20dp" > 
     <ScrollView 
      android:id="@+id/scroll_popup" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_centerHorizontal="true" 
      android:layout_centerVertical="true" 
      > 
      <LinearLayout 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:orientation="vertical" > 

       <TextView 
        android:id="@+id/txt_popup_message" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_margin="10dp" 
        android:textColor="@android:color/black" 
        android:textSize="18dp" /> 
      </LinearLayout> 
     </ScrollView> 
    </RelativeLayout> 
</RelativeLayout> 

在styles.xml:

<style name="dialog_style_no_bg" parent="@android:style/Theme.Dialog"> 
     <item name="android:windowNoTitle">true</item> 
     <item name="android:windowBackground">@android:color/transparent</item> 
    </style> 

調用者應該傳遞View.OnClickListeners。 爲了能夠關閉對話框,調用者必須具有Dialog dialog場,然後在OnClickListener用來關閉該對話框,如:

this.dialog = Utils.showStyledPopup(this, null, getString(R.string.STR_ENABLE_SOUND_AND_MUSIC_Q), 
        getString(R.string.STR_YES), new View.OnClickListener() 
        { 
         @Override 
         public void onClick(View v) 
         { 
          doToggleSound(); 
          doToggleMusic(); 
          dialog.dismiss(); 
          dialog = null; 
         } 
        }, getString(R.string.STR_NO), new View.OnClickListener() 
        { 
         @Override 
         public void onClick(View v) 
         { 
          dialog.dismiss(); 
          dialog = null; 
         } 
        }); 

的問題是,由於某種原因,在極少數情況下,對話領域得到當彈出窗口仍然顯示時重置。我無法重現這一點,但因爲這個領域的原因,得到了一些崩潰報告。

有人試圖做同樣的事嗎?

該活動的定位修復了風景,因此onCreate應該永遠不會被調用以重置dialog變量。

我不喜歡存儲參考對話的想法,但就是沒有辦法在這種情況下,使用final變量,因爲它應該傳遞給OnClickListener後得到的值

我的問題與Android close custom dialog類似,但問題也沒有解決,至少我想要它(作爲Utils中的1方法)。

我見過onCreate()被稱爲在奇怪的時間DellStreak設備上,所以這可能是隻是一些特定於設備的問題(PMP5080BRU)

+0

你爲什麼要這樣做,而不僅僅是擴展對話框類? – you786 2012-03-30 20:25:47

回答

1

的解決辦法是宣佈Dialog dialog爲類字段,在類中聲明它水平。

編輯
也試試這個解決方案。將對話框作爲Utils類中的類字段。不要從方法返回對話框對象,而是使用它來初始化對話框變量。使用getter方法(或嘗試直接訪問,儘管不推薦)對話變量。這是一個骯髒的解決方案,但它也可能適用於你。

+0

PS:另一個問題的問題已解決,提問者使用Dialog,而不是對話框來解僱。 – noob 2012-03-30 19:56:28

+0

我想這正是我所做的:this.dialog = ...是類字段。但問題是,它有時會重置! – iseeall 2012-03-30 20:15:31

+0

那麼例外是什麼?如果它重置,那麼它必須拋出一個NullPointerException。你也需要使對話框不可取消嗎? – noob 2012-03-30 20:21:16