Урок 65. Диалоги. AlertDialog. Кастомизация

Обсуждение уроков
Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Урок 65. Диалоги. AlertDialog. Кастомизация

Сообщение damager82 » 28 мар 2012, 23:00

В этом уроке:

- используем свои View для построения диалога

[url=http://www.startandroid.ru/ru/uroki/vse ... l:2y3kvecs]Click here to read this article![/url:2y3kvecs]
Последний раз редактировалось damager82 12 май 2017, 11:56, всего редактировалось 5 раз.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Artemko
Сообщения: 26
Зарегистрирован: 16 июл 2012, 15:09

Re: Урок 65. Диалоги. AlertDialog. Кастомизация

Сообщение Artemko » 11 авг 2012, 11:11

Хочу в диалог добавить SeekBar, делаю так:

Код: Выделить всё

    
seekBar = (SeekBar) findViewById(R.id.Seek);
seekBar.setOnSeekBarChangeListener(SeekBarListener);
protected Dialog onCreateDialog(int id) {
if (id == DIALOG_1) {    	
        AlertDialog.Builder adb = new AlertDialog.Builder(this);
        // создаем view из dialog.xml
        view = (LinearLayout) getLayoutInflater().inflate(R.layout.mana_dialog, null);
        // устанавливаем ее, как содержимое тела диалога
        adb.setView(view);
        // кнопка положительного ответа
        adb.setPositiveButton(R.string.yes, ManaClickListener);
        // кнопка отрицательного ответа
        adb.setNegativeButton(R.string.no, ManaClickListener);
        // кнопка нейтрального ответа
        // создаем диалог
        return adb.create();
      }
    return super.onCreateDialog(id);
    }


private SeekBar.OnSeekBarChangeListener SeekBarListener = new OnSeekBarChangeListener() {

    public void onStopTrackingTouch(SeekBar seekBar) {
            //add code here
    }

    public void onStartTrackingTouch(SeekBar seekBar) {
            //add code here
    }

    public void onProgressChanged(SeekBar seekBark, int progress, boolean fromUser) {
            //add code here
    }
 };
Вот такая ошибка появляется:
08-10 16:48:06.423: E/AndroidRuntime(3318): FATAL EXCEPTION: main
08-10 16:48:06.423: E/AndroidRuntime(3318): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.aero.recept1/com.aero.recept1.MainActivity}: java.lang.NullPointerException
08-10 16:48:06.423: E/AndroidRuntime(3318): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1834)
08-10 16:48:06.423: E/AndroidRuntime(3318): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1850)
08-10 16:48:06.423: E/AndroidRuntime(3318): at android.app.ActivityThread.access$1500(ActivityThread.java:125)
08-10 16:48:06.423: E/AndroidRuntime(3318): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:941)
08-10 16:48:06.423: E/AndroidRuntime(3318): at android.os.Handler.dispatchMessage(Handler.java:99)
08-10 16:48:06.423: E/AndroidRuntime(3318): at android.os.Looper.loop(Looper.java:130)
08-10 16:48:06.423: E/AndroidRuntime(3318): at android.app.ActivityThread.main(ActivityThread.java:3935)
08-10 16:48:06.423: E/AndroidRuntime(3318): at java.lang.reflect.Method.invokeNative(Native Method)
08-10 16:48:06.423: E/AndroidRuntime(3318): at java.lang.reflect.Method.invoke(Method.java:507)
08-10 16:48:06.423: E/AndroidRuntime(3318): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864)
08-10 16:48:06.423: E/AndroidRuntime(3318): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
08-10 16:48:06.423: E/AndroidRuntime(3318): at dalvik.system.NativeStart.main(Native Method)
08-10 16:48:06.423: E/AndroidRuntime(3318): Caused by: java.lang.NullPointerException
08-10 16:48:06.423: E/AndroidRuntime(3318): at com.aero.recept1.MainActivity.onCreate(MainActivity.java:58)
08-10 16:48:06.423: E/AndroidRuntime(3318): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-10 16:48:06.423: E/AndroidRuntime(3318): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1788)
08-10 16:48:06.423: E/AndroidRuntime(3318): ... 11 more

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

Re: Урок 65. Диалоги. AlertDialog. Кастомизация

Сообщение math64 » 11 авг 2012, 22:01

Почему поиск seekBar вне onCreateDialog() ? И искать нужно не в Activity, а в view

Код: Выделить всё

view = (LinearLayout) getLayoutInflater().inflate(R.layout.mana_dialog, null);
seekBar = (SeekBar) view.findViewById(R.id.Seek);

Аватара пользователя
powercat
Сообщения: 508
Зарегистрирован: 20 июл 2012, 11:31

Re: Урок 65. Диалоги. AlertDialog. Кастомизация

Сообщение powercat » 12 сен 2012, 13:58

А почему в этом уроке в конце не вызываем родителя?

Код: Выделить всё

return super.onCreateDialog(id);
А в более ранних - вызывали.

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

Re: Урок 65. Диалоги. AlertDialog. Кастомизация

Сообщение math64 » 12 сен 2012, 14:27

powercat писал(а):А почему в этом уроке в конце не вызываем родителя?
А в более ранних - вызывали.
Вызов кончается

Код: Выделить всё

return adb.create();
- некуда вставлять.
В более ранних уроках был switch или if и super.onCreateDialog(id); вызывался, когда не попадали ни в какой вариант.

Аватара пользователя
powercat
Сообщения: 508
Зарегистрирован: 20 июл 2012, 11:31

Re: Урок 65. Диалоги. AlertDialog. Кастомизация

Сообщение powercat » 12 сен 2012, 14:55

Так вызывались оба крита...а не один...блин...как же все непонятно (((

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

Re: Урок 65. Диалоги. AlertDialog. Кастомизация

Сообщение math64 » 12 сен 2012, 15:24

В этом уроке в onCreateDialog() нет проверки id - поэтому метод суперкласса и не вызывается нигде.

Аватара пользователя
Xroft
Сообщения: 38
Зарегистрирован: 10 май 2012, 10:11

Re: Урок 65. Диалоги. AlertDialog. Кастомизация

Сообщение Xroft » 22 сен 2012, 03:13

Доброго времени суток!
Как в теле диалога привязать обработку своих кнопок (не стандартных - setPositiveButton, setNegativeButton), а именно саморучно нарисованных

Код: Выделить всё

protected Dialog onCreateDialog(int id) {
		AlertDialog.Builder adb = new AlertDialog.Builder(MyClass.this);
	    view = (LinearLayout) getLayoutInflater()
	            .inflate(R.layout.dialog_add_cnt, null);

	    	adb.setTitle("ЗЛОЙ Заголовок");
	        adb.setView(view);
	        adb.setPositiveButton(R.string.btnOk, myClickListener);
	     return adb.create();
		}
	
		protected void onPrepareDialog (int id, Dialog dialog) {
			super.onPrepareDialog(id, dialog);
			TextView tv1 = (TextView) dialog.getWindow().findViewById(R.id.tv1);
			tv1.setText(cg.getString(2));
			//Имя товара
			TextView tv2 = (TextView) dialog.getWindow().findViewById(R.id.tv2);
			tv2.setText(cg.getString(3));
                        EditText etCnt = (EditText) ((Dialog) dialog).getWindow().findViewById(R.id.etCnt)
                        Button btnOne = (Button) dialog.getWindow().findViewById(R.id.btnOne);
                }
нужно к btnOne привязать обработчик (идея по кнопке менять значение etCnt)
в упор не могу нарыть как это сделать((((

Заранее спасибо!!!

Аватара пользователя
Xroft
Сообщения: 38
Зарегистрирован: 10 май 2012, 10:11

Re: Урок 65. Диалоги. AlertDialog. Кастомизация

Сообщение Xroft » 23 сен 2012, 11:37

Господа, подскажите, это вообще реально?)

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Урок 65. Диалоги. AlertDialog. Кастомизация

Сообщение AndreyI » 23 сен 2012, 11:51

А что, так не получается?

Код: Выделить всё

btnOne.setOnClickListener(new OnClickListener() {			
			@Override
			public void onClick(View v) {
				
				//Код обработки
			}
		});

Аватара пользователя
Xroft
Сообщения: 38
Зарегистрирован: 10 май 2012, 10:11

Re: Урок 65. Диалоги. AlertDialog. Кастомизация

Сообщение Xroft » 23 сен 2012, 21:14

AndreyI писал(а):А что, так не получается?

Код: Выделить всё

btnOne.setOnClickListener(new OnClickListener() {			
			@Override
			public void onClick(View v) {
				
				//Код обработки
			}
		});
матерится, просит изменить onClick на

Код: Выделить всё

public void onClick(DialogInterface dialog, int which) {
					// TODO Auto-generated method stub
					
				}
посте изменения ругается, что метот setOnClickListener неможет содержать (new DialogInterface.OnClickListener() , хотя у меня (new OnClickListener()
... вобщем хз куда и как его тулить
... к слову, все это прописываю в protected void onPrepareDialog (int id, Dialog dialog) {

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Урок 65. Диалоги. AlertDialog. Кастомизация

Сообщение AndreyI » 23 сен 2012, 21:26

у вас не тот интерфейс импортировался.
замените new OnClickListener() на new android.view.View.OnClickListener()
или исправьте импорт.

Аватара пользователя
Xroft
Сообщения: 38
Зарегистрирован: 10 май 2012, 10:11

Re: Урок 65. Диалоги. AlertDialog. Кастомизация

Сообщение Xroft » 24 сен 2012, 21:18

AndreyI писал(а):замените new OnClickListener() на new android.view.View.OnClickListener()
Вот оно!!! Спасибо огромное!!!

Аватара пользователя
Xroft
Сообщения: 38
Зарегистрирован: 10 май 2012, 10:11

Re: Урок 65. Диалоги. AlertDialog. Кастомизация

Сообщение Xroft » 24 сен 2012, 21:20

Не приймите за наглость, поинтересуюсь....
Как правильно вынести диалог в отдельный класс, т к его описание занимает много места, и использоваться он будет много раз. я понимаю что это ООП. Но с диалогом в упор не понимаю как это реализовать.
Заранее спасибо

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Урок 65. Диалоги. AlertDialog. Кастомизация

Сообщение AndreyI » 24 сен 2012, 21:58

Xroft писал(а):Не приймите за наглость, поинтересуюсь....
Как правильно вынести диалог в отдельный класс, т к его описание занимает много места, и использоваться он будет много раз. я понимаю что это ООП. Но с диалогом в упор не понимаю как это реализовать.
Заранее спасибо
Эти диалоги в классическом варианте встроены в Activity поэтому
проще будет использовать DialogFragment я уже приводил пример его использования
класс MyAlert (начиная со строки 48) можно вынести в отдельный класс (ключевое слово static в этом случае можно убрать).

Alex_sh
Сообщения: 9
Зарегистрирован: 04 фев 2013, 12:10

Re: Урок 65. Диалоги. AlertDialog. Кастомизация

Сообщение Alex_sh » 29 мар 2013, 09:59

AndreyI писал(а):
Xroft писал(а):Не приймите за наглость, поинтересуюсь....
Как правильно вынести диалог в отдельный класс, т к его описание занимает много места, и использоваться он будет много раз. я понимаю что это ООП. Но с диалогом в упор не понимаю как это реализовать.
Заранее спасибо
Эти диалоги в классическом варианте встроены в Activity поэтому
проще будет использовать DialogFragment я уже приводил пример его использования
класс MyAlert (начиная со строки 48) можно вынести в отдельный класс (ключевое слово static в этом случае можно убрать).
У меня тот же вопрос, но если использовать DialogFragment, то мы сразу понимаем, что он работает начиная с API 11 к сожалению. Может кто может скинуть ссылку на ресурс или рассказать, как вынести код кастомного AlertDialog в отдельный класс?

Update:
Вопрос отпал. Увидел, что можно через библиотеку совместимости использовать DialogFragment.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 65. Диалоги. AlertDialog. Кастомизация

Сообщение rezak90 » 29 мар 2013, 10:39

но если использовать DialogFragment, то мы сразу понимаем, что он работает начиная с API 11 к сожалению
supportlibrary? не, не слышал :roll:
R.id.team
Политика на форуме запрещена

assan
Сообщения: 48
Зарегистрирован: 24 мар 2013, 22:31

Re: Урок 65. Диалоги. AlertDialog. Кастомизация

Сообщение assan » 08 июл 2013, 19:29

создаю свой диалог так

Код: Выделить всё

public class DialogQuantity {
    private Dialog dialog;
    private Activity activity;
    private NumberPicker numberPicker;
    private dishFrameView di;

    public DialogQuantity(Activity activity) {
        this.activity = activity;
        init();
    }

    private void init() {
        dialog = new Dialog(this.activity);
        dialog.setContentView(R.layout.dialog_quantity);
        Button button_ok = (Button) dialog.findViewById(R.id.button_ok);
        button_ok.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                dialog.dismiss();
            }
        });
    }

    public void show(diFrameView di) {
        this.di = di;
        dialog.show();
    }
}
всё создается , но как избавиться от title? или как изменить цвет, высоту и пр. параметры?

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Урок 65. Диалоги. AlertDialog. Кастомизация

Сообщение anber » 08 июл 2013, 19:33

assan писал(а):создаю свой диалог так

Код: Выделить всё

public class DialogQuantity {
    private Dialog dialog;
    private Activity activity;
    private NumberPicker numberPicker;
    private dishFrameView di;

    public DialogQuantity(Activity activity) {
        this.activity = activity;
        init();
    }

    private void init() {
        dialog = new Dialog(this.activity);
        dialog.setContentView(R.layout.dialog_quantity);
        Button button_ok = (Button) dialog.findViewById(R.id.button_ok);
        button_ok.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                dialog.dismiss();
            }
        });
    }

    public void show(diFrameView di) {
        this.di = di;
        dialog.show();
    }
}
всё создается , но как избавиться от title? или как изменить цвет, высоту и пр. параметры?
Что мешает использовать AlertDialog?
конкретно от title можно избавиться так:

Код: Выделить всё

Dialog dialog = new Dialog(context);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

assan
Сообщения: 48
Зарегистрирован: 24 мар 2013, 22:31

Re: Урок 65. Диалоги. AlertDialog. Кастомизация

Сообщение assan » 08 июл 2013, 19:58

Что мешает использовать AlertDialog?
ничего,
теперь делаю так

Код: Выделить всё

private void init(){
        LayoutInflater inflater = LayoutInflater.from( this.activity );
        View layout = inflater.inflate(R.layout.dialog_quantity, null);
        AlertDialog.Builder builder = new AlertDialog.Builder( this.activity );
        builder.setView(layout);
        dialog = builder.create();
      //  dialog.setTitle("Custom dialog title");
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        Button button_ok = (Button) layout.findViewById(R.id.button_ok);
        button_ok.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                dialog.dismiss();
            }
        });

    }
вверху и внизу черные полосы , видимо следы от title и места для кнопок
а это
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
не влияет..


я взял здесь http://www.seostella.com/ru/article/201 ... droid.html
вариант 2

Ответить