正确关闭自定义对话框

时间:2012-03-30 19:42:47

标签: android dialog

我想在整个应用程序中轻松显示自定义样式的弹出窗口。 为此我在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>
style.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)

1 个答案:

答案 0 :(得分:1)

解决方案是将Dialog dialog声明为类字段,在类级声明它。

修改
尝试这个解决方案。将对话框作为Utils类中的类字段。不要从方法返回对话框对象,而是使用它来初始化对话框变量。使用对话框变量的getter方法(或尝试直接访问,但不推荐)。这有点肮脏的解决方案,但它也可能对你有用。