Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
67 / 43 / 5
Регистрация: 24.08.2013
Сообщений: 678

Дождаться закрытия диалога

10.10.2013, 14:18. Показов 3020. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Один и тот же диалог используется в двух активити.
Т.к. его реализация достаточно громоздка, пытаюсь его использовать повторно, а не писать код 2 раза.
Из одного активити создаю другой, в котором прописан диалог и потом вызываю его:
Java
1
2
DirectoryActivity directoryActivity = new DirectoryActivity();
directoryActivity.ShowDialogProduct(id, 0, this);
Сам код диалога:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public void ShowDialogProduct(final long LineId, long ProductId, Context context) {
 
final Dialog dialogProduct = new Dialog(context);
dialogProduct.setContentView(R.layout.dialog_product);
//...
//...
//...
dialogProduct.show();
//...
//...
//...
// нажата кнопка Ок
((Button) dialogProduct.findViewById(R.id.btnPopProductOk))
        .setOnClickListener(new android.view.View.OnClickListener() {
            public void onClick(View v) {
//....
//....
//....
}
Проблема в том, что после закрытия диалога нужно обновить список в активити, из которого был вызван диалог.
В событии кнопки диалога я не могу это сделать (это не тот активити).
Есть ли способ?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.10.2013, 14:18
Ответы с готовыми решениями:

Отслеживание закрытия диалога
Здравствуйте! Имеется вот такой класс: package com.contedevel.timetable; import java.util.ArrayList; import java.util.List; ...

Прервать выполнение кода до закрытия диалога
Кнопка "создать документ". Нужно сделать диалог-предупреждение типа "введенные на странице данные могут вызвать проблемы"...

Какой метод фрагмента срабатывает после закрытия диалога?
Запускаю FragmentActivity, в методе onResume запускаю DialogFragment. Пока выполняются кое-какие действия, диалог висит, перекрыв...

9
Android Developer
 Аватар для Wenceslaus
131 / 131 / 6
Регистрация: 05.07.2013
Сообщений: 205
10.10.2013, 14:30
Slon747, перенесите ShowDialogProduct выше по уровню абстракции и все проблемы отпадут.
Т.е. реализуйте этот метод в некотором GlobalActivity, а от него наследуйте те Activity, которые уже используются. В итоге код пишется один раз и одинаково используется во всех наследниках.
1
67 / 43 / 5
Регистрация: 24.08.2013
Сообщений: 678
10.10.2013, 15:02  [ТС]
Цитата Сообщение от Wenceslaus Посмотреть сообщение
Slon747, перенесите ShowDialogProduct выше по уровню абстракции и все проблемы отпадут.
Т.е. реализуйте этот метод в некотором GlobalActivity, а от него наследуйте те Activity, которые уже используются. В итоге код пишется один раз и одинаково используется во всех наследниках.
Я не совсем понял.
Вот у меня 2 активити из которых вызывается диалог:
Java
1
2
3
4
public class DirectoryActivity extends Activity {
}
public class DocumentActivity extends Activity {
}
Мне нужно создать отдельную активити (например GlobalActivity), реализовать в нем показ диалога и потом поменять наследование у этих двух с Activity на GlobalActivity.
Но как обработать событие кнопки в диалоге?
0
 Аватар для Netscape
374 / 361 / 52
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
10.10.2013, 15:09
Передавайте в ShowDialogProduct еще реализацию OnClickListener.
0
67 / 43 / 5
Регистрация: 24.08.2013
Сообщений: 678
10.10.2013, 15:24  [ТС]
Цитата Сообщение от Netscape Посмотреть сообщение
Передавайте в ShowDialogProduct еще реализацию OnClickListener.
А тут совсем не понял. Как передать? И что потом можно сделать?
Может я не точно объяснил? У диалога в setOnClickListener уже есть код для изменения БД. Нужно после этого перечитать список у вызывающего диалог активити.
0
 Аватар для Netscape
374 / 361 / 52
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
10.10.2013, 15:38
примерно, вот так
Java
1
2
3
4
public void ShowDialogProduct(final long LineId, long ProductId, Context context, View.OnClickListener listener) {
((Button) dialogProduct.findViewById(R.id.btnPopProductOk))
        .setOnClickListener(listener);
}
дальше.
в 1 активити
Java
1
2
3
4
5
View.OnClickListener listener = new View.OnClickListener() {
public void onClick(View v) {
// здесь код изменения БД
}
};
и вызываете диалог:
Java
1
ShowDialogProduct(LineId, roductId, context, listener);
во втором активити точно также, но в методе onClick пишете уже другой код.

Добавлено через 6 минут
Цитата Сообщение от Slon747 Посмотреть сообщение
DirectoryActivity directoryActivity = new DirectoryActivity();
Это очень плохо.
сделайте ShowDialogProduct static методом и вызывайте DirectoryActivity.ShowDialogProduct, без создания объекта.
И еще, перечитайте java code convension.
1
Android Developer
 Аватар для Wenceslaus
131 / 131 / 6
Регистрация: 05.07.2013
Сообщений: 205
10.10.2013, 16:18
Slon747, можно связать интерфейсами или использовать абстрактный метод, который отдельно реализуется каждым из классов наследников:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public abstract class GlobalActivity extends Activity {
 
    public void ShowDialogProduct(final long LineId, long ProductId, Context context) {
     
        final Dialog dialogProduct = new Dialog(context);
        dialogProduct.setContentView(R.layout.dialog_product);
        //...
        dialogProduct.show();
        //...
        // нажата кнопка Ок
        ((Button) dialogProduct.findViewById(R.id.action_settings)).setOnClickListener(new android.view.View.OnClickListener() {
            public void onClick(View v) {
                dialogClickOk();
            }
        });
        //....
    }
 
    abstract void dialogClickOk();
 
}
 
public class DocumentActivity extends GlobalActivity {
 
    @Override
    void dialogClickOk() {
        //обновление списка
        reloadList();
        
    }
    
}
1
67 / 43 / 5
Регистрация: 24.08.2013
Сообщений: 678
10.10.2013, 21:21  [ТС]
Netscape, Спасибо! Получилось.
Цитата Сообщение от Netscape Посмотреть сообщение
Это очень плохо.
сделайте ShowDialogProduct static методом и вызывайте DirectoryActivity.ShowDialogProduct, без создания объекта.
Спасибо. Так и сделал.
Цитата Сообщение от Netscape Посмотреть сообщение
И еще, перечитайте java code convension.
Прочитаю и всё переименую

Wenceslaus, Спасибо. Ваш вариант тоже попробовал. Но из-за недостатка опыта не смог применить.
Когда я переделал ф-ю в статическую не получилось вызвать абстрактный метод dialogClickOk(); из статич. ф-ции, а сам абстрактный метод нельзя сделать статическим.
0
Android Developer
 Аватар для Wenceslaus
131 / 131 / 6
Регистрация: 05.07.2013
Сообщений: 205
11.10.2013, 12:00
Slon747, зря вы переделали ф-ю в статическую. Этот вариант правильный только для способа, который предложил Netscape. В моём подходе ваш Activity (наследник GlobalActivity) уже содержит метод ShowDialogProduct и вызывается не через класс, а через объект класса.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class DocumentActivity extends GlobalActivity {
    
    //метод, в котором создаётся диалог
    public void someAction() {
        //установка LineId и ProductId
        ShowDialogProduct(LineId, ProductId, this);
    }
    
 
    @Override
    void dialogClickOk() {
        //обновление списка
        reloadList();
        
    }
    
}
Но это так, пища для размышлений и +1 способ к решению проблемы..
1
67 / 43 / 5
Регистрация: 24.08.2013
Сообщений: 678
11.10.2013, 12:25  [ТС]
Цитата Сообщение от Wenceslaus Посмотреть сообщение
Slon747, зря вы переделали ф-ю в статическую. Этот вариант правильный только для способа, который предложил Netscape. В моём подходе ваш Activity (наследник GlobalActivity) уже содержит метод ShowDialogProduct и вызывается не через класс, а через объект класса.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class DocumentActivity extends GlobalActivity {
    
    //метод, в котором создаётся диалог
    public void someAction() {
        //установка LineId и ProductId
        ShowDialogProduct(LineId, ProductId, this);
    }
    
 
    @Override
    void dialogClickOk() {
        //обновление списка
        reloadList();
        
    }
    
}
Но это так, пища для размышлений и +1 способ к решению проблемы..
Спасибо. Так тоже попробую. Наверняка где-нибудь пригодится
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.10.2013, 12:25
Помогаю со студенческими работами здесь

Вызов диалога из диалога
Есть диалог, как сделать чтобы при выборе определенной позиции в это диалоге открывался другой диалог? case 0: AlertDialog.Builder...

Дождаться ответа из сети
лишнее вырезал public class Main_Activity extends Activity { @Override protected void onCreate(Bundle...

Дождаться ответа от сервера
public class Network { public static boolean isConnected = false; public static void isConnected(final Context context,...

Как дождаться завершения RequestTask?
при создании активити в new RequestTask().execute делаю веб запрос, по результатам которого достраивается интерфейс... т.к. в потоке его...

AsyncTask как дождаться окончания
Всем привет. Ситуация следующая. Есть активити "MyTravelList" со списком, которое после нажатия на кнопку, запускает другое активити...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru