Отклонение диалога от представления содержимого, отличного от XML - PullRequest
0 голосов
/ 03 мая 2011

У меня есть настраиваемое диалоговое окно (расширяет диалог), содержимое которого является настраиваемой группой просмотра. В группе просмотра есть несколько дочерних элементов edittext, но я сам занимаюсь рисованием и нажатием кнопок в методах dispatchDraw и onTouch группы просмотра (я стараюсь избежать раздувания как можно большего количества представлений). В частности: в этом представлении нет дочерних элементов кнопки, которые я мог бы установить в качестве кнопки отклонения для диалога. Я хочу закрыть диалоговое окно из метода onTouch группы просмотра , но за его пределами. имитируя нажатие клавиши «назад», я не могу понять, как это сделать.

код активности:

public class My_Activity extends Activity {
    ...
    public void onCreate(Bundle savedInstanceState) {
        ...
        //if there's no Class_That_Im_Editing in the database, prompt the user to make a new one by adding information to the editviews in this custom dialog and clicking the area where I draw the ok button
        my_dialog = new Custom_Dialog(this, R.style.CustomDlg, new Class_That_Im_Editing());
    }
}

код диалога:

public class Custom_Dialog extends Dialog {
    ...
        public void onCreate(Bundle savedInstanceState) {
            ...
            setContentView(new Custom_ViewGroup(context, Class_That_Im_Editing));
        }
}

код группы просмотра:

public class Custom_ViewGroup extends ViewGroup implements OnTouchListener {
    //this class has some edittext children but _no_ buttons
    ...
    public boolean onTouch(View view, MotionEvent event) {
        if ( logic checking if the user has clicked the button area ) {
            //??? what do I put here to dismiss the dialog
        }
    }
}

Единственный другой подход, который я могу придумать, - это использование метода dismissDialog (int), что означает переопределение обработчиков событий onCreateDialog и onPrepareDialog. Но как я могу вызвать dismissDialog из метода onTouch представления?

Может быть, мне нужно настроить какого-нибудь слушателя? Если это так, какой код будет использоваться для этого?

1 Ответ

1 голос
/ 04 мая 2011

Таким образом, проблема заключалась в том, чтобы сообщить диалогу dismiss (), когда я не находился в области, в которой этот диалог существовал. Вот мое решение:

Создайте OnTouchListener в той же области, что и диалоговое окно - в данном случае, в моей основной деятельности. Затем передайте его при инициализации диалогового окна, которое, в свою очередь, должно передать его группе просмотра.

Это будет выглядеть примерно так:

код активности:

public class My_Activity extends Activity {
    public Custom_Dialog my_dialog;
    ...
    public void onCreate(Bundle savedInstanceState) {
        OnTouchListener otl_custom_dialog = new OnTouchListener() {
            public boolean onTouch(View view, MotionEvent event) {
                if ( logic checking if the user has clicked the button area ) {
                    //notice I can still access any _public_ variable within the viewgroup class
                    //by using my_dialog.my_custom_viewgroup.public_variable
                    ...
                    //I can now call dismiss() from within this scope
                    my_dialog.dismiss();
                }
                ...
            }
        }
        ...
        //if there's no Class_That_Im_Editing in the database, prompt the user to make a new one by adding information to the editviews in this custom dialog and clicking the area where I draw the ok button
        my_dialog = new Custom_Dialog(this, R.style.CustomDlg, new Class_That_Im_Editing(), otl_custom_dialog);
        my_dialog.show();
    }
}

код диалога:

public class Custom_Dialog extends Dialog {
    Custom_ViewGroup my_custom_viewgroup;
    OnTouchListener otl_custom_dialog;
    ...
        public void onCreate(Bundle savedInstanceState) {
            ...
            setContentView(new Custom_ViewGroup(context, class_that_im_editing, otl_custom_dialog));
        }
}

код группы просмотра:

public class Custom_ViewGroup extends ViewGroup implements OnTouchListener {
    public Custom_ViewGroup(Context context, Class_That_Im_Editing class_that_im_editing, OnTouchListener otl_custom_dialog) {
        ...
        this.setOnTouchListener(otl_custom_dialog);
    }
}

Я проверил этот метод, и он отлично работает. Надеюсь, это поможет кому-то еще!

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