Урок 62. Диалоги. AlertDialog. Список

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

Урок 62. Диалоги. AlertDialog. Список

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

В этом уроке:

- формируем список в диалоге

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

Jack_killer
Сообщения: 21
Зарегистрирован: 30 янв 2012, 21:15

Re: Урок 62. Диалоги. AlertDialog. Список

Сообщение Jack_killer » 28 июл 2012, 23:42

Сегодня увидел что методы onCreateDialog и onPrepareDialog на сайте http://developer.android.com подписаны как "This method is deprecated." и рекомендуют использовать DialogFragment.
This method is deprecated.
Use the new DialogFragment class with FragmentManager instead; this is also available on older platforms through the Android compatibility package.


Может вы вставите маленький курс по этому новому методу.

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

Re: Урок 62. Диалоги. AlertDialog. Список

Сообщение AndreyI » 30 июл 2012, 01:20

Вот вариант использования DialogFragment взамен Dialog (применительно к AlertDialod).
Я практичестки взял готовые конструкции из http://developer.android.com/intl/ru/re ... gment.html добавил только передачу текста сообщения (message) помимо заголовка (title).
В примере два поля для ввода, одно для ввода заголовка диалога и второе для сообщения и одна кнопка вызова диалога. Иконка и текст для кнопок взяты из стандартных ресурсов Андроид.
main.xml

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <EditText
        android:id="@+id/Title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"        
        android:hint="Title" >

        <requestFocus />
    </EditText>

    <EditText
        android:id="@+id/Message"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"        
        android:hint="Message" />

    <Button        
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onClick"
        android:text="Show Alert" />

</LinearLayout>
MainActivity.java

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

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;//Android API 11 и выше
import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
//Для совместимости с API от 4-й версии нужно использовать библиотеку совместимости
//import android.support.v4.app.DialogFragment; 
//import android.support.v4.app.FragmentActivity;


//При использовании библиотеки совместимости Activity заменить на FragmentActivity
public class MainActivity extends Activity {
	final String LOG_TAG = "myLogs";

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

	public void onClick(View v) {
		String title = ((EditText) findViewById(R.id.Title)).getText().toString();
		String message = ((EditText) findViewById(R.id.Message)).getText().toString();

		showAlert(title, message);
	}
		
	//Вызов диалога
	private void showAlert(String _title, String _message) {
		DialogFragment newFragment = MyAlert.newInstance(_title, _message);
		//При использовании библиотеки совместимости вызывать getSupportFragmentManager()
		//вместо getFragmentManager()
		newFragment.show(getFragmentManager(), "dialog");
	}
	//Обработка нажатия позитивной кнопки
	public void doPositiveClick() {
		Log.d(LOG_TAG, "Pressed OK button");
	}
	//Обработка нажатия негативной кнопки
	public void doNegativeClick() {
		Log.d(LOG_TAG, "Pressed Cancel button");
	}

	public static class MyAlert extends DialogFragment {
		public static MyAlert newInstance(String title, String message) {
			MyAlert frag = new MyAlert();
			Bundle args = new Bundle();
			args.putString("title", title);
			args.putString("message", message);
			frag.setArguments(args);
			return frag;
		}

		@Override
		public Dialog onCreateDialog(Bundle savedInstanceState) {
			Bundle args = getArguments(); //Получаем заголовок и сообщение 
			String title = args.getString("title");
			String message = args.getString("message");

			return new AlertDialog.Builder(getActivity())
					.setIcon(android.R.drawable.ic_dialog_alert)
					.setTitle(title)
					.setMessage(message)
					.setPositiveButton(android.R.string.ok,
					new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog,int whichButton) {
							((MainActivity) getActivity()).doPositiveClick();
						}
					})
					.setNegativeButton(android.R.string.cancel,
					new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog,int whichButton) {
							((MainActivity) getActivity()).doNegativeClick();
						}
					})
					.create();
		}
	}
}
Пример будет работать только с API старше 11-й версии. Для совместимости с младшими версиями нужно использовать библиотеку совместимости. При этом все Activity использующие фрагменты нужно наследовать от FragmentActivity из пакета android.support.v4.app, разумеется DialogFragment тоже должен быть из android.support.v4.app.DialogFragment. Вместо метода getFragmentManager() нужно вызывать getSupportFragmentManager() .
В общем-то все просто, кода чуть больше.

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

Re: Урок 62. Диалоги. AlertDialog. Список

Сообщение AndreyI » 30 июл 2012, 01:47

Вот не понимаю я гугловцев. Столько наставлений расписали по части стайлинга приложений Андроид, чтоб интерфейс был однообразен для пользователей и пр., а сами допускают какие-то лишенные всякой логики ляпы.
К примеру, порядок кнопок в AlertDialog для некоторых тем (в частности HOLO) они применили обратный (т.е. позитивная кнопка справа), для чего? Где здесь логика? Для левшей? Допустим, пользователь вводит какой-то длинный текст, нажав на кнопку Back будет, скажем, предложен диалог сохранения и он вполне может по запарке клацнуть кнопку отмены вместо "ОК".

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

Re: Урок 62. Диалоги. AlertDialog. Список

Сообщение damager82 » 30 июл 2012, 11:02

Jack_killer писал(а):Сегодня увидел что методы onCreateDialog и onPrepareDialog на сайте http://developer.android.com подписаны как "This method is deprecated." и рекомендуют использовать DialogFragment.
This method is deprecated.
Use the new DialogFragment class with FragmentManager instead; this is also available on older platforms through the Android compatibility package.


Может вы вставите маленький курс по этому новому методу.
Да, где-то в конце августа я начну выкладывать материалы по новшествам третьего андроида.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

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

Re: Урок 62. Диалоги. AlertDialog. Список

Сообщение math64 » 30 июл 2012, 13:28

А зачем третьего? переходите сразу на четвёртый
http://developer.android.com/intl/ru/ab ... index.html
2.3.3 Gingerbread вытесняет 2.2 Froyo, а сам вытесняется 4.0.3 Ice Cream Sandwich
А доля Honeycomb 3.0-3.2 вряд ли будет увеличиваться.

var49
Сообщения: 24
Зарегистрирован: 25 авг 2012, 09:13

Re: Урок 62. Диалоги. AlertDialog. Список

Сообщение var49 » 11 сен 2012, 21:08

Куда ни кинь - всюду клин! Делаю диалог, в который показываю список из курсора. Как я понимаю, там внутри из курсора формируется список и Listener возвращает мне номер строки ЭТОГО СПИСКА, по которой я кликнул.
Но мне-то надо id ТОЙ ЗАПИСИ КУРСОРА, по которой я кликнул!!!
Пусть у меня в таблице данные:
2 Яша
3 Петя
4 Саша
И пусть они в курсоре именно в таком порядке.
Я кликнул в Петю. Мне вернулся выбор - 1.
А если я курсор отсортирую по алфавиту:
3 Петя
4 Саша
2 Яша
То, при выборе Пети я получаю - 0.
А как мне получить Петин id, равный 3?

var49
Сообщения: 24
Зарегистрирован: 25 авг 2012, 09:13

Re: Урок 62. Диалоги. AlertDialog. Список

Сообщение var49 » 11 сен 2012, 21:35

Глупость спросил :( Не пинайте, плз.

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

Re: Урок 62. Диалоги. AlertDialog. Список

Сообщение rezak90 » 11 сен 2012, 22:55

Cursor привязан к ListView? и какой адаптер используете? Лучше использовать комбинацию ListView+Cursor+SimpleCursorAdapter что и позволяет решать выше описанные проблемы.
R.id.team
Политика на форуме запрещена

var49
Сообщения: 24
Зарегистрирован: 25 авг 2012, 09:13

Re: Урок 62. Диалоги. AlertDialog. Список

Сообщение var49 » 12 сен 2012, 20:11

Нее. Мой глупый вопрос был вызван тем, что я "забыл", что имею дело с курсором, а не с реляционной таблицей. В курсоре-то строки нумерованы, а значит по позиции в списке я могу однозначно получить строку курсора. А в ней уже есть все необходимые данные.

Аватара пользователя
Vici
Сообщения: 12
Зарегистрирован: 06 ноя 2012, 00:29

Re: Урок 62. Диалоги. AlertDialog. Список

Сообщение Vici » 08 июл 2013, 19:06

Не запускается полная копипаста кода :oops:

Изображение
Изображение

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

Re: Урок 62. Диалоги. AlertDialog. Список

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

Vici писал(а):Не запускается полная копипаста кода :oops:
Ну ошибка "no such table" говорит собственно о том что не найдена таблица mytab
А не найдена она потому что скорее всего не создана.
А не создана она скорее всего потому что не вызвался метод db.execSQL(DB_CREATE);
А почему он не вызвался я не знаю, скорее всего какой-то кусок кода недокопировали.
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Аватара пользователя
Vici
Сообщения: 12
Зарегистрирован: 06 ноя 2012, 00:29

Re: Урок 62. Диалоги. AlertDialog. Список

Сообщение Vici » 10 июл 2013, 13:39

anber писал(а):
Vici писал(а):Не запускается полная копипаста кода :oops:
Ну ошибка "no such table" говорит собственно о том что не найдена таблица mytab
А не найдена она потому что скорее всего не создана.
А не создана она скорее всего потому что не вызвался метод db.execSQL(DB_CREATE);
А почему он не вызвался я не знаю, скорее всего какой-то кусок кода недокопировали.
Забавно: пересоздал точно такой же проект и всё заработало. Может глюк eclipse?

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

Re: Урок 62. Диалоги. AlertDialog. Список

Сообщение anber » 10 июл 2013, 13:48

Vici писал(а):
anber писал(а):
Vici писал(а):Не запускается полная копипаста кода :oops:
Ну ошибка "no such table" говорит собственно о том что не найдена таблица mytab
А не найдена она потому что скорее всего не создана.
А не создана она скорее всего потому что не вызвался метод db.execSQL(DB_CREATE);
А почему он не вызвался я не знаю, скорее всего какой-то кусок кода недокопировали.
Забавно: пересоздал точно такой же проект и всё заработало. Может глюк eclipse?
Бывает что он использует устаревшие данные иногда кое-что приходится вручную обновлять, типа refresh
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Аватара пользователя
Isaev
Сообщения: 145
Зарегистрирован: 03 сен 2013, 09:39
Откуда: Германия
Контактная информация:

Re: Урок 62. Диалоги. AlertDialog. Список

Сообщение Isaev » 24 окт 2013, 10:31

Не получилось из OnClickListener достучаться до значения самих выбираемых пунктов)
Это возможно? или возможно только создавать глобальную переменную и присваивать ей значение в onPrepareDialog?

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 62. Диалоги. AlertDialog. Список

Сообщение Mikhail_dev » 24 окт 2013, 10:34

Откуда не удалось достучаться, куда не удалось достучаться, непонятно.

Аватара пользователя
Isaev
Сообщения: 145
Зарегистрирован: 03 сен 2013, 09:39
Откуда: Германия
Контактная информация:

Re: Урок 62. Диалоги. AlertDialog. Список

Сообщение Isaev » 24 окт 2013, 10:55

no--

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

// обработчик нажатия на пункт списка диалога
  DialogInterface.OnClickListener myClickListener = new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int which) {
      String item=null;
      switch(dialogId) {
        case DIALOG_ITEMS:
        case DIALOG_ADAPTER:
          item=((AlertDialog)dialog).getListView().getItemAtPosition(which).toString();
          break;
        case DIALOG_CURSOR:
          cursor = db.getAllData();
          item=???
          break;
      }
      // выводим в лог позицию нажатого элемента
      Log.d(LOG_TAG,"which = "+which+" ("+item+")");
    }
  };

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 62. Диалоги. AlertDialog. Список

Сообщение Mikhail_dev » 24 окт 2013, 12:00

Все равно понять не могу. Что надо получить? Имя нажатого View элемента? Его позицию?

Аватара пользователя
Isaev
Сообщения: 145
Зарегистрирован: 03 сен 2013, 09:39
Откуда: Германия
Контактная информация:

Re: Урок 62. Диалоги. AlertDialog. Список

Сообщение Isaev » 24 окт 2013, 12:12

Его текст... для первых двух диалогов я его получил, а в случии с курсором не выходит

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 62. Диалоги. AlertDialog. Список

Сообщение Mikhail_dev » 24 окт 2013, 12:15

Ладно, особо не могу понять что там не так. Что за ошибку пишет?

Ответить