Правильно закрывающий пользовательский диалог - PullRequest
0 голосов
/ 30 марта 2012

Я хотел бы легко отображать всплывающие окна в индивидуальном стиле во всем приложении.Для этого в моем классе 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 закрыть пользовательский диалог но проблема там также не решена, по крайней мере, так, как я хочу (как 1 метод в Utils).

Я видел, как вызывается onCreate()на устройстве DellStreak в какое-то странное время, так что это может быть связано только с проблемой конкретного устройства (PMP5080BRU)

1 Ответ

1 голос
/ 30 марта 2012

Решение было бы объявить Dialog dialog как поле класса, объявить его на уровне класса.

РЕДАКТИРОВАТЬ
Попробуйте это решение тоже.Имейте диалог как поле класса в классе Utils.Не возвращайте объект диалога из метода, вместо этого используйте его для инициализации переменной диалога.Используйте метод получения (или попробуйте получить прямой доступ к диалоговой переменной, хотя и не рекомендуется).Это довольно грязное решение, но оно может сработать и для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...