Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
AlexV1
-2 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 36
#1

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

07.06.2016, 15:13. Просмотров 615. Ответов 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 и создание своего диалога - Программирование Android
Разбирал на стартандроиде 110 урок по DialogFragment...

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

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

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

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

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

11
petruchodd
109 / 106 / 11
Регистрация: 23.06.2009
Сообщений: 584
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
109 / 106 / 11
Регистрация: 23.06.2009
Сообщений: 584
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,734
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,734
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,734
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,734
16.06.2016, 19:50 #11
AlexV1, здесь вам лучше ознакомиться с жизнедеятельностью фрагментов.
Параметры туда передаются обычно через метод newInstance (не помню точно, можно ещё через аргументы и Intent).
Допустим, у вас есть такой метод init (в Яве методы надо писать со строчной буквы, классы - с прописной). Там нужно создать Bundle и сохранить аргументы, а в onCreate их получить. Вот первая попавшая ссылка на это: http://stackoverflow.com/a/15459259/2914140.
Передавать данные через конструктор не рекомендуется, поскольку при повороте устройства будет вызван конструктор с пустым списком параметров.
Таким образом, сначала вызывается init, сохраняются аргументы, затем вызывается onCreate, аргументы загружаются.

Добавлено через 2 минуты
Можно также использовать onCreateDialog, я не помню, в чём разница.
Один деятель на той же странице внизу предлагает обойтись без аргументов, просто сохранив данные в локальные переменные. Это нерабочий способ, не пользуйтесь им. Переменные запросто занулятся.
0
petruchodd
109 / 106 / 11
Регистрация: 23.06.2009
Сообщений: 584
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 - Программирование Android
доброго времени суток не могли бы подсказать где можно взять пример самого просто приложения (или поделиться ссылкой на инфу) со свайп...

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

Реализация диалога android - Программирование Android
Доброго времени суток. Решил написать простенький месседжер, и столкнулся с такой проблемой: Не знаю как это называется и как такое...

Дисклеймер в виде диалога - Программирование Android
Как лучше создать дисклеймер в виде диалогового окна: нажимаешь на кнопку &quot;Согласен&quot;, он больше не показывается, нажимаешь кнопку &quot;Не...


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

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

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