Страница 1 из 2

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

Добавлено: 05 мар 2012, 03:00
damager82
В этом уроке:

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

[url=http://www.startandroid.ru/ru/uroki/vse ... l:lcmvevzb]Click here to read this article![/url:lcmvevzb]

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

Добавлено: 28 июл 2012, 23:42
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.


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

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

Добавлено: 30 июл 2012, 01:20
AndreyI
Вот вариант использования 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() .
В общем-то все просто, кода чуть больше.

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

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

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

Добавлено: 30 июл 2012, 11:02
damager82
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.


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

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

Добавлено: 30 июл 2012, 13:28
math64
А зачем третьего? переходите сразу на четвёртый
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 вряд ли будет увеличиваться.

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

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

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

Добавлено: 11 сен 2012, 21:35
var49
Глупость спросил :( Не пинайте, плз.

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

Добавлено: 11 сен 2012, 22:55
rezak90
Cursor привязан к ListView? и какой адаптер используете? Лучше использовать комбинацию ListView+Cursor+SimpleCursorAdapter что и позволяет решать выше описанные проблемы.

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

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

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

Добавлено: 08 июл 2013, 19:06
Vici
Не запускается полная копипаста кода :oops:

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

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

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

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

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

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

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

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

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

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

Добавлено: 24 окт 2013, 10:34
Mikhail_dev
Откуда не удалось достучаться, куда не удалось достучаться, непонятно.

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

Добавлено: 24 окт 2013, 10:55
Isaev
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+")");
    }
  };

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

Добавлено: 24 окт 2013, 12:00
Mikhail_dev
Все равно понять не могу. Что надо получить? Имя нажатого View элемента? Его позицию?

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

Добавлено: 24 окт 2013, 12:12
Isaev
Его текст... для первых двух диалогов я его получил, а в случии с курсором не выходит

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

Добавлено: 24 окт 2013, 12:15
Mikhail_dev
Ладно, особо не могу понять что там не так. Что за ошибку пишет?