Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
AlexV1
-2 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 36
#1

Создание своего простейшего диалога - Программирование Android

07.06.2016, 15:13. Просмотров 763. Ответов 11
Метки нет (Все метки)

Добрый день!

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

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
 
public class MyAlertDialogFragment extends DialogFragment implements DialogInterface.OnClickListener {
 
    public static final int RESULT_POSITIVE = 1;
    public static final int RESULT_NEGATIVE = 2;
    public static final int RESULT_NEUTRAL = 3;
 
    public int resultDialog;
 
    @Override
    public Dialog onCreateDialog(Bundle saveInstanceState) {
        AlertDialog.Builder adb = new AlertDialog.Builder(getActivity())
                .setCancelable(true)
                .setTitle("Title тут")
                .setNegativeButton("no", this)
                .setPositiveButton("yes", this)
                .setNeutralButton("neutral", this)
                .setMessage("body msg");
 
        adb.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                // User clicked positive button
                resultDialog = MyAlertDialogFragment.RESULT_POSITIVE;
                dialog.cancel();
            }
        });
 
        adb.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                // User clicked positive button
                resultDialog = MyAlertDialogFragment.RESULT_NEGATIVE;
                dialog.cancel();
            }
        });
 
        adb.setNeutralButton("Neutral", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                // User clicked positive button
                resultDialog = MyAlertDialogFragment.RESULT_NEUTRAL;
                dialog.cancel();
            }
        });
 
        return adb.create();
    }
 
    @Override
    public void onDismiss(DialogInterface dialog) {
        super.onDismiss(dialog);
    }
 
    @Override
    public void onCancel(DialogInterface dialog) {
        super.onCancel(dialog);
    }
}
Вызываю из другой Activity так:

Java
1
2
3
4
5
6
7
MyAlertDialogFragment D = new MyAlertDialogFragment();
FragmentManager fm = getSupportFragmentManager();
D.show(fm, "test dialog");
 
if (D.resultDialog == MyAlertDialogFragment.RESULT_POSITIVE) Log.d("text","Позитив");
if (D.resultDialog == MyAlertDialogFragment.RESULT_NEGATIVE) Log.d("text","Негатив");
if (D.resultDialog == MyAlertDialogFragment.RESULT_NEUTRAL) Log.d("text","Нейтрал");

Запускаем и видим вот что:

1) На строке
Java
1
D.show(fm, "test dialog");
происходит построение диалога - вызов MyAlertDialogFragment.onCreateDialog()
А почему-то не при создании моего класса - строке
Java
1
MyAlertDialogFragment D = new MyAlertDialogFragment()
? - я ожидал что он сконструируется именно при создании.
Это нормально? Почему так, объясните в 2-х словах у кого опыт есть.

2) Нельзя из Activity перед открытием диалога настроить у него Title, text, icon, надписи на кнопках.
А мне это нужно, т.к. класс универсальный делаю.
Как бы его так модернизировать, чтобы перед show можно было настроить диалог?

3) Строка
Java
1
D.show(fm, "test dialog");
показывает диалог, НО не останавливает выполнение программы в моей Activity (не ждет пока юзер ответит Да/Нет/Не знаю) а идет на проверку результата выбора в диалоге.
Хотелось бы конечно не внутри класса MyAlertDialogFragment обрабатывать результат, а в вызывающем Activity, т.к. в разных случаях будет разная обработка.
Как тут лучше поступить?

Спасибо заранее за дельные советы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.06.2016, 15:13
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Создание своего простейшего диалога (Программирование Android):

DialogFragment и создание своего диалога
Разбирал на стартандроиде 110 урок по DialogFragment...

Создание своего дизайна Android
Вопрос примитивен, но для меня важен. Сейчас нужно сделать уникальный...

Создание своего дизайна для приложения
Доброго времени суток! Я новичок в программировании под Андроид, и у меня есть...

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

Вызов диалога из диалога
Есть диалог, как сделать чтобы при выборе определенной позиции в это диалоге...

AlarmManager и реализация простейшего будильника
Здравствуйте. Пожалуйста, линканите пример будильника. В сети не нашёл хороших...

11
petruchodd
125 / 122 / 18
Регистрация: 23.06.2009
Сообщений: 662
13.06.2016, 16:21 #2

Не по теме:

не навижу alert builder


При инициализации ты просто создаешь свой алерт, но не показываешь ( return adb.create)
для отображения диалогов используется функция .show

хм. я посмотрел на android off site
и вижу что код полностью идентичный. Но видимо не дочитали дальше

Java
1
Now, when you create an instance of this class and call show() on that object, the dialog appears as shown in figure 1.
насчет пункта 3 ,оно и не остановит программу. Для этого нужно обрабатывать сами нажатия на yes/no/neutral в диалоге. Поидее if либо упадет на nullpointerexception либо вообще просто не зайдет ( resultDialog не инициализирован)
0
AlexV1
-2 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 36
14.06.2016, 13:28  [ТС] #3
> Не по теме:
> не навижу alert builder

Это тоже по теме.
А что не нравится в alert builder?
И скажите, как бы вы построили диалог, если к примеру надо решить мою задачу?
0
petruchodd
125 / 122 / 18
Регистрация: 23.06.2009
Сообщений: 662
14.06.2016, 15:56 #4
примерно так
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Dialogs {
    Dialog dialog;
    public  Dialogs(Context context){
        dialog = new Dialog(context);
        dialog.setContentView(R.layout.mydialog);
        dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
        dialog.setCanceledOnTouchOutside(false);
    }
  
    public void show(){ 
        dialog.show();
    }
    
    public void stop(){
        dialog.dismiss();
    }
}
с возможностью задавать его как захочется. Но это я бы так сделал.

Алерт не нравится своим (имхо) сложным строительством.
1
CoolMind
421 / 404 / 65
Регистрация: 06.10.2012
Сообщений: 1,732
14.06.2016, 19:00 #5
Цитата Сообщение от AlexV1 Посмотреть сообщение
А что не нравится в alert builder?
Лучше его не использовать, а использовать DialogFragment. Потому что во втором случае диалог подчиняется жизненному циклу активности, к которой присоединён. Можно даже вызвать из другого класса (допустим, из потока) и привязать фрагмент к активности. После этого поворот устройства на 87 градусов не сломает программу.

Добавлено через 3 минуты
Цитата Сообщение от petruchodd Посмотреть сообщение
Алерт не нравится своим (имхо) сложным строительством.
Да, это тоже его минус. Чтобы поменять какие-то размеры, приходится или новую разметку рисовать, или получать доступ к отдельным контролам и манипулировать ими (размеры и цвета кнопок, надписей и т.д.)
1
AlexV1
-2 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 36
15.06.2016, 06:10  [ТС] #6
petruchodd, спасибо за набросок public class Dialogs, правда хотелось бы знать какие кнопки в вашей разметке R.layout.mydialog и делаете где и как делаете обработку нажатий кнопок. Если можно, приведите пожалуйста пример вызова диалога.

Лучше его не использовать, а использовать DialogFragment. Потому что во втором случае диалог подчиняется жизненному циклу активности, к которой присоединён.
CoolMind, спасибо и вам. Но с DialogFragment мне не удалось изобрести универсальный MessageBox.
Если не сложно, покажите пример на основе DialogFragment, так было бы понятней.
0
CoolMind
421 / 404 / 65
Регистрация: 06.10.2012
Сообщений: 1,732
15.06.2016, 09:17 #7
Цитата Сообщение от AlexV1 Посмотреть сообщение
DialogFragment мне не удалось изобрести универсальный MessageBox.
Недавно после двух дней мучений мне удалось это. Цель бы такой: показывать диалоговое окно по таймеру в любой открытой в настоящий момент активности. С передачей туда обработчиков кнопок (названий кнопок и обратных вызовов). Столкнулся с тем, что сериализовать активность и контекст нельзя. Пример приводить не стану, т.к. лучше вам самому понять, где могут быть ошибки.
0
AlexV1
-2 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 36
15.06.2016, 10:55  [ТС] #8
Хорошо, помучаюсь сам.
Хотя не пойму зачем показывать диалог по таймеру в любой открытой в настоящий момент активности.
Надеюсь это ваша специфика, и мне не придется делать по таймеру
0
CoolMind
421 / 404 / 65
Регистрация: 06.10.2012
Сообщений: 1,732
15.06.2016, 12:16 #9
Цитата Сообщение от AlexV1 Посмотреть сообщение
зачем показывать диалог по таймеру в любой открытой в настоящий момент активности.
Надеюсь это ваша специфика
Так и есть. Это чтобы пользователь не расслаблялся и не забывал кое-что в настройках поделать, пока в лес не убежал.
0
AlexV1
-2 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 36
16.06.2016, 19:29  [ТС] #10
Решил сконструировать свой новый диалог InputBox.

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
public class InputBox extends DialogFragment implements DialogInterface.OnClickListener {
 
    private View form=null;
    private AlertDialog.Builder builder;
    private Dialog DlgReady;
 
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
        form = getActivity().getLayoutInflater()
                .inflate(R.layout.inputbox_dialog, null);
 
        builder = new AlertDialog.Builder(getActivity());
        builder.setView(form);
        DlgReady = builder.create();
        return (DlgReady);
    }
 
    public void Init(String title, String msg, String positiveBtnTitle, String negativeBtnTitle, String neutralBtnTitle) {
        this.builder.setTitle(title);
        ((TextView)form.findViewById(R.id.message)).setText(msg);
        this.builder.setPositiveButton(positiveBtnTitle, this);
        if (negativeBtnTitle.length()>0) this.builder.setNegativeButton(negativeBtnTitle, null);
        if (neutralBtnTitle.length()>0) this.builder.setNeutralButton(neutralBtnTitle, null);        
    }
 
    ...
}
Вызываю так:

Java
1
2
3
InputBox D = new InputBox();
D.Init("Диалог ввода", "Введите что-нибудь", "Окей", "Неа", "Пофиг");
D.show(getSupportFragmentManager(), "my_input_box");
Не могу понять, почему на строке D.Init ЕЩЕ НЕ вызвался конструтор onCreateDialog моего класса InputBox, ведь объект я создаю перед вызовом Init
(в конструктор заходит в момент show)


1) Может подскажете в чем здесь магия?
2) И как сделать так, чтобы конструктор срабатывал все таки при создании объекта на строке InputBox D = new InputBox();
0
CoolMind
421 / 404 / 65
Регистрация: 06.10.2012
Сообщений: 1,732
16.06.2016, 19:50 #11
AlexV1, здесь вам лучше ознакомиться с жизнедеятельностью фрагментов.
Параметры туда передаются обычно через метод newInstance (не помню точно, можно ещё через аргументы и Intent).
Допустим, у вас есть такой метод init (в Яве методы надо писать со строчной буквы, классы - с прописной). Там нужно создать Bundle и сохранить аргументы, а в onCreate их получить. Вот первая попавшая ссылка на это: http://stackoverflow.com/a/15459259/2914140.
Передавать данные через конструктор не рекомендуется, поскольку при повороте устройства будет вызван конструктор с пустым списком параметров.
Таким образом, сначала вызывается init, сохраняются аргументы, затем вызывается onCreate, аргументы загружаются.

Добавлено через 2 минуты
Можно также использовать onCreateDialog, я не помню, в чём разница.
Один деятель на той же странице внизу предлагает обойтись без аргументов, просто сохранив данные в локальные переменные. Это нерабочий способ, не пользуйтесь им. Переменные запросто занулятся.
0
petruchodd
125 / 122 / 18
Регистрация: 23.06.2009
Сообщений: 662
17.06.2016, 00:47 #12
может быть потому что нету конструктора?

Не по теме:


п.с. заметил люди создают себе проблемы создавая уникальный код , который по их мнению почему -то не работает. Вопрос - зачем так делать? Годами создавались примеры , можна было бы уже выучить .

Стандартный класс с конструктором , советую вернутся на это начало

Java
1
2
3
4
public class myClass {
  public myClass{ //<-- это конструктор, вызывается при инициализации.
  }
}
вызов
Java
1
myClass mClass = new myClass(); // создали класс, у которого есть конструктор.



Если такой вариант не катит, советую в INIT перенести функции создания , вы все равно его инициализируете, в вашем случае конструктор класса не нужен. Не используйте то, что вы не понимаете или не знаете, лучше вернитесь на начало и попробуйте создать обычный простейший "свой" диалог, как пример, тот что я привел, в layout вы можете всунуть все что вы захотите. Поймите как оно работает . Может я тупой но я не вижу смысла никакого в коде который вы привели. (Это все мое только мнение, я не хочу никого обидеть)

Добавлено через 7 минут

Не по теме:

Блин вот из-за такого кода я и не навижу AlertDialog.

0
17.06.2016, 00:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.06.2016, 00:47
Привет! Вот еще темы с решениями:

Пример простейшего приложения со swipe-меню на Android
доброго времени суток не могли бы подсказать где можно взять пример самого...

Дисклеймер в виде диалога
Как лучше создать дисклеймер в виде диалогового окна: нажимаешь на кнопку...

Получить информацию из диалога
Всем привет! Есть в методе onCreate: new AlertDialog.Builder(this) ...

Переопределить стиль диалога
Здравствуйте! Никак не получается корректно переопределить стиль диалога....


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru