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

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

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

Сообщение anber » 09 июл 2013, 11:10

Я делаю так, и никаких полосок нет.

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

      AlertDialog.Builder builder = new AlertDialog.Builder(this);
      builder.setPositiveButton("Some text...", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
          // some more code 
          dialog.dismiss();
        }
      });
      builder.create().show();
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

andreykas
Сообщения: 4
Зарегистрирован: 30 сен 2013, 12:08

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

Сообщение andreykas » 02 окт 2013, 14:39

Здравствуйте!
Разбираю один пример кода по созданию диалога для ввода данных.
Есть отдельный клас DialogFactory для создания кастомного диалога

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

import android.app.AlertDialog.Builder;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.widget.EditText;
import android.widget.Toast;

public class DialogFactory {
	protected DialogFactory() {};
	
	public final static int DIALOG_INPUT = 0;

	public static Dialog getDialogById(int id, final Context context) {
		
		Dialog dialog = null;
		switch (id) {
		case DIALOG_INPUT:
			
			dialog = createInputAlert(context);
			break;
		}
		return dialog;
	}

	private static Dialog createInputAlert(final Context context) {
		Dialog dialog;
		Builder builder = new Builder(context);

		final EditText editText = new EditText(context);

		DialogInterface.OnClickListener onClickListener = new DialogInterface.OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int id) {
				
				switch(id) {
				
				case Dialog.BUTTON_POSITIVE:
					Toast.makeText(context, "Press positive button", Toast.LENGTH_SHORT).show();
					//Intent intent = new Intent();	
					//intent.putExtra("_dlgpassword", editText.getText().toString());
					//setResult(RESULT_OK, intent);
					break;
				case Dialog.BUTTON_NEGATIVE:
					//Toast.makeText(context, "Press negative button", Toast.LENGTH_SHORT).show();
					break;
					
				}
			}
		};
		dialog = builder.setMessage("Message")
						.setTitle("Title")
						.setPositiveButton("OK", onClickListener)
						.setNegativeButton("CANCEL", onClickListener)
						.setView(editText).create();
		return dialog;
	}

}
В MainActivity вызов диалога осуществляется следующим образом showDialog(DialogFactory.DIALOG_INPUT)

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

import android.app.Activity;
import android.app.Dialog;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.Toast;




public class MainActivity extends Activity {


	private static final int REQUEST_CODE = 0;
	Button btn;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// full screen mode
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
				
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		showDialog(CustomDialog.DIALOG_INPUT);
	}

		
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
	
	@Override
    protected void onPrepareDialog(int id, Dialog dialog) {
		super.onPrepareDialog(id, dialog);
    }
    
    @Override
    protected Dialog onCreateDialog(int id) {
    	return CustomDialog.getDialogById(id, this);
    }
    
	public void onBackPressed(){

	}
	
	@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            if(resultCode == RESULT_OK){
                    switch(requestCode){
                    case REQUEST_CODE:
                            Toast.makeText(this, getIntent().getStringExtra("_dlgpassword"), Toast.LENGTH_SHORT).show();
                            break;
                    }
             }
    }
	


	
}
Собственно суть вопроса.
Как в MainActivity получить данные введенные в TextEdit в данном диалог?е вызванном из главной активити?
Пробовал через Intent с setResult (закоментированные строки)
и onActivityResult (в главной активити) но в таком варианте создания диалога setResult не работает, екслипс даже не показывает такого метода, подчеркнуто красным.

Обмен данными между двумя активити через интенты работает, а вот диалог и активити, нет.
Последний раз редактировалось andreykas 02 окт 2013, 14:55, всего редактировалось 2 раза.

Аватара пользователя
adarash
Сообщения: 333
Зарегистрирован: 17 июл 2013, 09:59

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

Сообщение adarash » 02 окт 2013, 14:44

Покажи весь код в MainActivity, касающийся DialogFactory

andreykas
Сообщения: 4
Зарегистрирован: 30 сен 2013, 12:08

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

Сообщение andreykas » 02 окт 2013, 14:53

добавил код в предыдущее сообщение

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

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

Сообщение rezak90 » 02 окт 2013, 15:02

andreykas писал(а):добавил код в предыдущее сообщение
не используй этот код, точнее этот велосипед, слово "кастомизация" значит наследования или создания с нуля... у тебя здесь не понятно зачем нарисовалась фабрика :o
R.id.team
Политика на форуме запрещена

Аватара пользователя
adarash
Сообщения: 333
Зарегистрирован: 17 июл 2013, 09:59

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

Сообщение adarash » 02 окт 2013, 15:13

Почему бы тебе через Preferences не передать переменную?
rezak90 писал(а):
andreykas писал(а):добавил код в предыдущее сообщение
не используй этот код, точнее этот велосипед, слово "кастомизация" значит наследования или создания с нуля... у тебя здесь не понятно зачем нарисовалась фабрика :o
Полностью согласен.

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

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

Сообщение rezak90 » 02 окт 2013, 15:18

adarash писал(а):Почему бы тебе через Preferences не передать переменную?
этого тоже не следует делать))) вы все даёте, есть же ссылка на этот edittext или что там у тебя, трудно с него получить данные? никакие preferences или бд для этого не нужны, просто ООП.
R.id.team
Политика на форуме запрещена

Аватара пользователя
ivannatobedev
Сообщения: 30
Зарегистрирован: 03 дек 2014, 13:27

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

Сообщение ivannatobedev » 04 дек 2014, 12:48

Добрый день! Переписал пример один в один. После нажатия на любую кнопку, приложение останавливается. Подскажите, пожалуйста, что не так?

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

12-04 11:48:33.946: E/AndroidRuntime(7204): FATAL EXCEPTION: main
12-04 11:48:33.946: E/AndroidRuntime(7204): Process: com.example.alertdialogcustom, PID: 7204
12-04 11:48:33.946: E/AndroidRuntime(7204): java.lang.IllegalStateException: Could not execute method of the activity
12-04 11:48:33.946: E/AndroidRuntime(7204): 	at android.view.View$1.onClick(View.java:3954)
12-04 11:48:33.946: E/AndroidRuntime(7204): 	at android.view.View.performClick(View.java:4569)
12-04 11:48:33.946: E/AndroidRuntime(7204): 	at android.view.View$PerformClick.run(View.java:18570)
12-04 11:48:33.946: E/AndroidRuntime(7204): 	at android.os.Handler.handleCallback(Handler.java:733)
12-04 11:48:33.946: E/AndroidRuntime(7204): 	at android.os.Handler.dispatchMessage(Handler.java:95)
12-04 11:48:33.946: E/AndroidRuntime(7204): 	at android.os.Looper.loop(Looper.java:212)
12-04 11:48:33.946: E/AndroidRuntime(7204): 	at android.app.ActivityThread.main(ActivityThread.java:5135)
12-04 11:48:33.946: E/AndroidRuntime(7204): 	at java.lang.reflect.Method.invokeNative(Native Method)
12-04 11:48:33.946: E/AndroidRuntime(7204): 	at java.lang.reflect.Method.invoke(Method.java:515)
12-04 11:48:33.946: E/AndroidRuntime(7204): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878)
12-04 11:48:33.946: E/AndroidRuntime(7204): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
12-04 11:48:33.946: E/AndroidRuntime(7204): 	at dalvik.system.NativeStart.main(Native Method)
12-04 11:48:33.946: E/AndroidRuntime(7204): Caused by: java.lang.reflect.InvocationTargetException
12-04 11:48:33.946: E/AndroidRuntime(7204): 	at java.lang.reflect.Method.invokeNative(Native Method)
12-04 11:48:33.946: E/AndroidRuntime(7204): 	at java.lang.reflect.Method.invoke(Method.java:515)
12-04 11:48:33.946: E/AndroidRuntime(7204): 	at android.view.View$1.onClick(View.java:3949)
12-04 11:48:33.946: E/AndroidRuntime(7204): 	... 11 more
12-04 11:48:33.946: E/AndroidRuntime(7204): Caused by: android.view.InflateException: Binary XML file line #7: Error inflating class Textview
12-04 11:48:33.946: E/AndroidRuntime(7204): 	at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:707)
12-04 11:48:33.946: E/AndroidRuntime(7204): 	at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
12-04 11:48:33.946: E/AndroidRuntime(7204): 	at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
12-04 11:48:33.946: E/AndroidRuntime(7204): 	at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
12-04 11:48:33.946: E/AndroidRuntime(7204): 	at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
12-04 11:48:33.946: E/AndroidRuntime(7204): 	at com.example.alertdialogcustom.MainActivity.onCreateDialog(MainActivity.java:44)
12-04 11:48:33.946: E/AndroidRuntime(7204): 	at android.app.Activity.onCreateDialog(Activity.java:3023)
12-04 11:48:33.946: E/AndroidRuntime(7204): 	at android.app.Activity.createDialog(Activity.java:982)
12-04 11:48:33.946: E/AndroidRuntime(7204): 	at android.app.Activity.showDialog(Activity.java:3116)
12-04 11:48:33.946: E/AndroidRuntime(7204): 	at android.app.Activity.showDialog(Activity.java:3075)
12-04 11:48:33.946: E/AndroidRuntime(7204): 	at com.example.alertdialogcustom.MainActivity.onclick(MainActivity.java:35)
12-04 11:48:33.946: E/AndroidRuntime(7204): 	... 14 more
12-04 11:48:33.946: E/AndroidRuntime(7204): Caused by: java.lang.ClassNotFoundException: Didn't find class "android.view.Textview" on path: DexPathList[[zip file "/data/app/com.example.alertdialogcustom-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.example.alertdialogcustom-1, /vendor/lib, /system/lib]]
12-04 11:48:33.946: E/AndroidRuntime(7204): 	at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
12-04 11:48:33.946: E/AndroidRuntime(7204): 	at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
12-04 11:48:33.946: E/AndroidRuntime(7204): 	at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
12-04 11:48:33.946: E/AndroidRuntime(7204): 	at android.view.LayoutInflater.createView(LayoutInflater.java:559)
12-04 11:48:33.946: E/AndroidRuntime(7204): 	at android.view.LayoutInflater.onCreateView(LayoutInflater.java:652)
12-04 11:48:33.946: E/AndroidRuntime(7204): 	at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:66)
12-04 11:48:33.946: E/AndroidRuntime(7204): 	at android.view.LayoutInflater.onCreateView(LayoutInflater.java:669)
12-04 11:48:33.946: E/AndroidRuntime(7204): 	at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:694)
12-04 11:48:33.946: E/AndroidRuntime(7204): 	... 24 more
Caused by: android.view.InflateException: Binary XML file line #7: Error inflating class Textview
Выделила для тебя специально твою ошибку. Смотри внимательнее лог!

andreyh
Сообщения: 2
Зарегистрирован: 05 дек 2014, 16:45
Откуда: Украина

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

Сообщение andreyh » 05 дек 2014, 17:19

После нажатия на любую кнопку, приложение останавливается. Подскажите....

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

12-05 14:12:33.038: D/AndroidRuntime(346): Shutting down VM
12-05 14:12:33.048: W/dalvikvm(346): threadid=1: thread exiting with uncaught exception (group=0x40015560)
12-05 14:12:33.098: E/AndroidRuntime(346): FATAL EXCEPTION: main
12-05 14:12:33.098: E/AndroidRuntime(346): java.lang.IllegalStateException: Could not execute method of the activity
12-05 14:12:33.098: E/AndroidRuntime(346): 	at android.view.View$1.onClick(View.java:2144)
12-05 14:12:33.098: E/AndroidRuntime(346): 	at android.view.View.performClick(View.java:2485)
12-05 14:12:33.098: E/AndroidRuntime(346): 	at android.view.View$PerformClick.run(View.java:9080)
12-05 14:12:33.098: E/AndroidRuntime(346): 	at android.os.Handler.handleCallback(Handler.java:587)
12-05 14:12:33.098: E/AndroidRuntime(346): 	at android.os.Handler.dispatchMessage(Handler.java:92)
12-05 14:12:33.098: E/AndroidRuntime(346): 	at android.os.Looper.loop(Looper.java:123)
12-05 14:12:33.098: E/AndroidRuntime(346): 	at android.app.ActivityThread.main(ActivityThread.java:3683)
12-05 14:12:33.098: E/AndroidRuntime(346): 	at java.lang.reflect.Method.invokeNative(Native Method)
12-05 14:12:33.098: E/AndroidRuntime(346): 	at java.lang.reflect.Method.invoke(Method.java:507)
12-05 14:12:33.098: E/AndroidRuntime(346): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
12-05 14:12:33.098: E/AndroidRuntime(346): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
12-05 14:12:33.098: E/AndroidRuntime(346): 	at dalvik.system.NativeStart.main(Native Method)
12-05 14:12:33.098: E/AndroidRuntime(346): Caused by: java.lang.reflect.InvocationTargetException
12-05 14:12:33.098: E/AndroidRuntime(346): 	at java.lang.reflect.Method.invokeNative(Native Method)
12-05 14:12:33.098: E/AndroidRuntime(346): 	at java.lang.reflect.Method.invoke(Method.java:507)
12-05 14:12:33.098: E/AndroidRuntime(346): 	at android.view.View$1.onClick(View.java:2139)
12-05 14:12:33.098: E/AndroidRuntime(346): 	... 11 more
12-05 14:12:33.098: E/AndroidRuntime(346): Caused by: android.view.InflateException: Binary XML file line #2: Error inflating class linearLayout
12-05 14:12:33.098: E/AndroidRuntime(346): 	at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:581)
12-05 14:12:33.098: E/AndroidRuntime(346): 	at android.view.LayoutInflater.inflate(LayoutInflater.java:386)
12-05 14:12:33.098: E/AndroidRuntime(346): 	at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
12-05 14:12:33.098: E/AndroidRuntime(346): 	at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
12-05 14:12:33.098: E/AndroidRuntime(346): 	at ru.startandroid.develop.p0651alertdialogcustom.MainActivity.onCreateDialog(MainActivity.java:38)
12-05 14:12:33.098: E/AndroidRuntime(346): 	at android.app.Activity.onCreateDialog(Activity.java:2482)
12-05 14:12:33.098: E/AndroidRuntime(346): 	at android.app.Activity.createDialog(Activity.java:882)
12-05 14:12:33.098: E/AndroidRuntime(346): 	at android.app.Activity.showDialog(Activity.java:2557)
12-05 14:12:33.098: E/AndroidRuntime(346): 	at android.app.Activity.showDialog(Activity.java:2524)
12-05 14:12:33.098: E/AndroidRuntime(346): 	at ru.startandroid.develop.p0651alertdialogcustom.MainActivity.onclick(MainActivity.java:32)
12-05 14:12:33.098: E/AndroidRuntime(346): 	... 14 more
12-05 14:12:33.098: E/AndroidRuntime(346): Caused by: java.lang.ClassNotFoundException: android.view.linearLayout in loader dalvik.system.PathClassLoader[/data/app/ru.startandroid.develop.p0651alertdialogcustom-1.apk]
12-05 14:12:33.098: E/AndroidRuntime(346): 	at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:240)
12-05 14:12:33.098: E/AndroidRuntime(346): 	at java.lang.ClassLoader.loadClass(ClassLoader.java:551)
12-05 14:12:33.098: E/AndroidRuntime(346): 	at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
12-05 14:12:33.098: E/AndroidRuntime(346): 	at android.view.LayoutInflater.createView(LayoutInflater.java:471)
12-05 14:12:33.098: E/AndroidRuntime(346): 	at android.view.LayoutInflater.onCreateView(LayoutInflater.java:549)
12-05 14:12:33.098: E/AndroidRuntime(346): 	at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:66)
12-05 14:12:33.098: E/AndroidRuntime(346): 	at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:568)
12-05 14:12:33.098: E/AndroidRuntime(346): 	... 23 more

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

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

Сообщение doter.ua » 05 дек 2014, 17:58

Скинь код МейнАктивити целиком. По-моему, ты криво создаешь элементы.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

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

Сообщение Foenix » 05 дек 2014, 19:04

код активити тут не поможет
ошибка
Caused by: android.view.InflateException: Binary XML file line #2: Error inflating class linearLayout
welcome по ссылкам в подписи :)
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

andreyh
Сообщения: 2
Зарегистрирован: 05 дек 2014, 16:45
Откуда: Украина

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

Сообщение andreyh » 08 дек 2014, 15:35

После нажатия на любую кнопку, приложение останавливается. Подскажите..
МейнАктивити целиком.

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

package ru.startandroid.develop.p0651alertdialogcustom;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;
import android.widget.TextView;


public class MainActivity extends Activity {
	final int DIALOG = 1;
	int btn;
	LinearLayout view;
	SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
	TextView tvCount;
	ArrayList<TextView> textViews;
	public void onCreate (Bundle savedInstanState) { 
		super.onCreate(savedInstanState);
		setContentView(R.layout.main);
		textViews = new ArrayList<TextView> (10);
		}
	public void onclick(View v) {
		btn = v.getId();
		showDialog(DIALOG);
		}
	protected Dialog onCreateDialog (int id) {
		AlertDialog.Builder adb = new AlertDialog.Builder(this);
		adb.setTitle("Custom dialog");
		//create view is dialog.xml
		view = (LinearLayout) getLayoutInflater().inflate(R.layout.dialog, null);
		//set it as the body content of dialogue
		adb.setView(view);
		// find TextView to display the count
		tvCount = (TextView) view.findViewById(R.id.tvCount);
		return adb.create();
		}	
	protected void onPrepareDialog(int id, Dialog dialog) {
		super.onPrepareDialog(id, dialog);
		if (id == DIALOG) {
			//find TextView to display the time and shows current time
			TextView tvTime = (TextView) dialog.getWindow().findViewById(R.id.tvTime);
			tvTime.setText(sdf.format(new Date(System.currentTimeMillis())));
			//if click button Add
			if (btn == R.id.btnAdd){
				//create new TextView add the dialog set text
				TextView tv = new TextView (this);
				view.addView(tv, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
				tv.setText("TextView " + (textViews.size() + 1));
				//addnew TextView to collection
				textViews.add(tv);
				//else
			}
			else{
				//if new colection not null
				if (textViews.size() > 0 ) { 
					//find in the collection of the last  TextView
					TextView tv = textViews.get(textViews.size() - 1);
					//delete is dialog
					view.removeView(tv);
				}	
			}		//delete is colection
					tvCount.setText("Количество TextView = " + textViews.size());
					
					
			 
				
			}
		}
		
	}


Аватара пользователя
Stashevckiy
Сообщения: 3
Зарегистрирован: 10 окт 2014, 11:22

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

Сообщение Stashevckiy » 28 янв 2015, 10:30

Доброго времени суток, товарищи! Помогите, пожалуйста, советом по одному вопросу. Вобщем, есть окно диалога, с кастомным view( обычный лайаут с EditText элементом ). Так вот, при первом вызове диалога и его закрытии программа отрабатывает нормально, но при последующей попытке опять же вызвать диалоговое окно, программа падает. Я попробовал повторить все те же операции, не помещая кастомного View как контент, в окно диалога - все отрабатывает норм. Выходить, что какая-то проблема состоит около кастомного View и над его управлением. Что не так, я пока что не смог разобраться..

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

public class MainActivity extends Activity {

	ListView list;
	SimpleAdapter sAdapter;
	ArrayList<Map<String, Object>> data;
	String []from = {"text", "image"};
	AlertDialog.Builder abuilder;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		data = new ArrayList< Map< String, Object> >();

		Map< String, Object> element= new HashMap< String, Object>(); 
		element.put(from[0], "Новая запись");
		element.put(from[1], R.drawable.plus);
		data.add(element);

		int []to = {R.id.text, R.id.button};
		sAdapter = new SimpleAdapter(this, data, R.layout.item, from, to);
		list = (ListView) findViewById(R.id.lvSimple);
		list.setAdapter(sAdapter);

		LayoutInflater linf = LayoutInflater.from(this);            
		final View inflator = linf.inflate(R.layout.content, null);

		abuilder = new AlertDialog.Builder(this);
		abuilder.setTitle("Название");
		abuilder.setIcon(R.drawable.edit);
		abuilder.setView(inflator);
		
		abuilder.setPositiveButton("Ок", new OnClickListener() {			
			@Override
			public void onClick(DialogInterface dialog, int which) {
				dialog.dismiss();
			}
		});
		abuilder.setNegativeButton("Отмена", new OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				dialog.dismiss();
			}
		});
	}

	public void onButtonClick(View v) {
		abuilder.show();
	}
E/AndroidRuntime(31769): java.lang.IllegalStateException: Could not execute method of the activity
E/AndroidRuntime(31769): at android.view.View$1.onClick(View.java:3969)
E/AndroidRuntime(31769): at android.view.View.performClick(View.java:4633)
E/AndroidRuntime(31769): at android.view.View$PerformClick.run(View.java:19330)
E/AndroidRuntime(31769): at android.os.Handler.handleCallback(Handler.java:733)
E/AndroidRuntime(31769): at android.os.Handler.dispatchMessage(Handler.java:95)
E/AndroidRuntime(31769): at android.os.Looper.loop(Looper.java:157)
E/AndroidRuntime(31769): at android.app.ActivityThread.main(ActivityThread.java:5356)
E/AndroidRuntime(31769): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(31769): at java.lang.reflect.Method.invoke(Method.java:515)
E/AndroidRuntime(31769): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
E/AndroidRuntime(31769): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
E/AndroidRuntime(31769): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(31769): Caused by: java.lang.reflect.InvocationTargetException
E/AndroidRuntime(31769): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(31769): at java.lang.reflect.Method.invoke(Method.java:515)
E/AndroidRuntime(31769): at android.view.View$1.onClick(View.java:3964)
E/AndroidRuntime(31769): ... 11 more
E/AndroidRuntime(31769): Caused by: java.lang.IllegalStateException: The specified child already has a parent.
You must call removeView() on the child's parent first.
E/AndroidRuntime(31769): at android.view.ViewGroup.addViewInner(ViewGroup.java:3759)
E/AndroidRuntime(31769): at android.view.ViewGroup.addView(ViewGroup.java:3612)
E/AndroidRuntime(31769): at android.view.ViewGroup.addView(ViewGroup.java:3588)
E/AndroidRuntime(31769): at com.android.internal.app.AlertController.setupView(AlertController.java:414)
E/AndroidRuntime(31769): at com.android.internal.app.AlertController.installContent(AlertController.java:242)
E/AndroidRuntime(31769): at android.app.AlertDialog.onCreate(AlertDialog.java:337)
E/AndroidRuntime(31769): at android.app.Dialog.dispatchOnCreate(Dialog.java:363)
E/AndroidRuntime(31769): at android.app.Dialog.show(Dialog.java:264)
E/AndroidRuntime(31769): at android.app.AlertDialog$Builder.show(AlertDialog.java:951)
E/AndroidRuntime(31769): at vs.vladshevchenko.notes.app.MainActivity.onButtonClick(MainActivity.java:86)
UPDATED:
Решил проблему переносом в функцию onButtonClick кода создания диалога. Пока не понятно, что там по памяти будет, но ошибка с критом приложения ушла..

Ленивенко
Сообщения: 8
Зарегистрирован: 10 мар 2015, 11:57

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

Сообщение Ленивенко » 10 мар 2015, 12:01

Добрый день. Подскажите, как сделать в AlertDialog такую прокрутку как в TimePickerDialog

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

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

Сообщение doter.ua » 10 мар 2015, 12:04

Ленивенко писал(а):Добрый день. Подскажите, как сделать в AlertDialog такую прокрутку как в TimePickerDialog
Класс extends Dialog + layout с таймпикером.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

dassad
Сообщения: 8
Зарегистрирован: 20 дек 2015, 00:03

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

Сообщение dassad » 18 июл 2016, 23:14

не знаю, уже сама суть перепалок здесь в чате говорит о том что это темная тема с кастомизацией диалогов, и очень уж много всяких палок в колеса.
в этом смысле увы сабж тема на сайте вышла неудачной, некреативной (ну очевидно что стоило как-то поиграться с ImageView напр), и увы пользы не принесло.

pl--alex
Сообщения: 4
Зарегистрирован: 24 окт 2016, 17:19

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

Сообщение pl--alex » 03 ноя 2016, 14:10

выполнил пример с помощью DialogFragment . Какие могут быть замечания?
Код класса с Диалогом

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

package com.example.praktikum.fandroid23_dialog_fragment;

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.icu.text.SimpleDateFormat;
import android.os.Bundle;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.Date;



public class CustomDialog extends DialogFragment {
    LinearLayout view;
    SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
    TextView tvCount,tvTime;
    ArrayList<TextView> textViews = new ArrayList<TextView>(10);

    public static CustomDialog newInstance(int data){

        CustomDialog customDialog = new CustomDialog();
        Bundle args = new Bundle();
        args.putInt("cntAdd",data);
        customDialog.setArguments(args);
        return customDialog;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        int cntAdd = getArguments().getInt("cntAdd");

        AlertDialog.Builder adb = new AlertDialog.Builder(getActivity());
        adb.setTitle("Custom Dialog");

        view =(LinearLayout)getActivity().getLayoutInflater().inflate(R.layout.custom_dialog,null);
        adb.setView(view);
        tvCount = (TextView)view.findViewById(R.id.tvCount);
        tvTime = (TextView)view.findViewById(R.id.tvTime);
        tvTime.setText(sdf.format(new Date(System.currentTimeMillis())));

        for (int i=0;i<cntAdd;i++) {
            TextView tv = new TextView(getActivity());
            view.addView(tv, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
            tv.setText("TextView " + (textViews.size() + 1));
            textViews.add(tv);
        }
        Toast.makeText(getActivity(),String.valueOf(cntAdd),Toast.LENGTH_SHORT).show();

        return adb.create();
    }
}
Два куска кода из MainActivity
Какой из вариантов лучше и почему?

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

int cntAdd = 0;
 public void onClick(View view) {
        switch (view.getId()){
            case R.id.btnRemove:
                cntAdd--;
                DialogFragment customDialog1 = CustomDialog.newInstance(cntAdd);
                customDialog1.show(getFragmentManager(),"custom dialog");
                break;
            case R.id.btnAdd:
                cntAdd++;
                DialogFragment customDialog = CustomDialog.newInstance(cntAdd);
                customDialog.show(getFragmentManager(),"custom dialog");
                break;
        }
    }

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

int cntAdd = 0;
 public void onClick(View view) {
        switch (view.getId()){
           case R.id.btnRemove:
                cntAdd--;
                cntAdd--;
            case R.id.btnAdd:
                cntAdd++;
                DialogFragment customDialog = CustomDialog.newInstance(cntAdd);
                customDialog.show(getFragmentManager(),"custom dialog");
                break;
        }
    }

EugeneDev
Сообщения: 5
Зарегистрирован: 24 ноя 2016, 14:34
Откуда: Odessa

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

Сообщение EugeneDev » 27 ноя 2016, 13:41

Всем привет, в тело АлертДиалога прикрутил EditText, а при нажатии на позитивную кнопку надо считать этот текст с EditText. Приложение падает когда начинается считывание инфы с EditText.

builder = new AlertDialog.Builder(this);
builder.setView(R.layout.dialog_change_category_name);
builder.setTitle(R.string.dialog_changeCatName);
builder.setPositiveButton(R.string.btnChangeTask_change, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
strRes = etDialogCatName.getText().toString(); - ВОТ ТУТ ВЫДАЕТ ОШИБКУ
}
});

java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference
Помогите понять почему etDialogCatName - NullPointerException

EugeneDev
Сообщения: 5
Зарегистрирован: 24 ноя 2016, 14:34
Откуда: Odessa

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

Сообщение EugeneDev » 27 ноя 2016, 14:39

EugeneDev писал(а):Всем привет, в тело АлертДиалога прикрутил EditText, а при нажатии на позитивную кнопку надо считать этот текст с EditText. Приложение падает когда начинается считывание инфы с EditText.

builder = new AlertDialog.Builder(this);
builder.setView(R.layout.dialog_change_category_name);
builder.setTitle(R.string.dialog_changeCatName);
builder.setPositiveButton(R.string.btnChangeTask_change, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
strRes = etDialogCatName.getText().toString(); - ВОТ ТУТ ВЫДАЕТ ОШИБКУ
}
});

java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference
Помогите понять почему etDialogCatName - NullPointerException
Сам отвечу на свой вопрос, может кому-то будет полезно

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

           //Получаем Инфлейтер
        layoutInflater = getLayoutInflater();
        //Получаем View для диалога
        viewDialog = layoutInflater.inflate(R.layout.dialog_change_category_name, null);
           //Создаем билдер
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            //Получаем View
            final View v = layoutInflater.inflate(R.layout.dialog_change_category_name, null, false);
            //Устанавливаем Заголовок
            builder.setTitle(R.string.dialog_changeCatName);
            //Присваиваем view в ТЕЛО билдера
            builder.setView(v);
            //Если нажата положительная кнопка
            builder.setPositiveButton(R.string.btnChangeTask_change, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    //находим в нашем View EditText и считываем информацию из него
                    EditText etNewName = (EditText) v.findViewById(R.id.etDialog_changeName);
                    String strRes = etNewName.getText().toString();
                    //Передаем id  и Новое имя в метод для изменения Названия
                    db.changeRecInTableCategory(id, strRes);
                    //Обновляем курсор
                    loaderCategory.forceLoad();
                }
            });

Ответить