Урок 66. Диалоги. Обработчики и операции

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

Урок 66. Диалоги. Обработчики и операции

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

В этом уроке:

- рассматриваем обработчики событий диалога
- программно закрываем и показываем диалог

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

gera
Сообщения: 9
Зарегистрирован: 11 окт 2012, 23:30

Re: Урок 66. Диалоги. Обработчики и операции

Сообщение gera » 23 окт 2012, 19:20

можно было для метода hide() добавить к сравнению метод show();

и собственно визуально это работает одинаково:

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

void method1() {
    dismissDialog(DIALOG);
//или
    removeDialog(DIALOG);
//или
    dialog.dismiss();
//или
    dialog.hide();
  }

  void method2() {
    showDialog(DIALOG);
//или
    dialog.show();
  }

v_grechka
Сообщения: 20
Зарегистрирован: 09 авг 2012, 13:30

Re: Урок 66. Диалоги. Обработчики и операции

Сообщение v_grechka » 30 ноя 2012, 10:17

А можно ли в кастомный диалог добавить кнопку и прописать на ней событие?

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

final EditText Info_text = (EditText)root.findViewById(R.id.Info_edit);
	   
		         Button Info_button = (Button)root.findViewById(R.id.Info_button);
		       OnClickListener ClickListener=new OnClickListener(){

					public void onClick(DialogInterface dialog, int which) {
						// TODO Auto-generated method stub
						Info_text.setText("111111");
						Log.d("LOG_TAG", "Нажатие кнопки Info_button"); 
					}};
					
		
					Info_button.setOnClickListener(ClickListener);
Вот такой код дает ошибку в

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

Info_button.setOnClickListener(ClickListener);
Или настроить одну из кнопок диалога так, чтобы она не закрывала диалог, а производила какие-то действия на форме диалога?

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

Re: Урок 66. Диалоги. Обработчики и операции

Сообщение damager82 » 30 ноя 2012, 16:16

v_grechka писал(а):Вот такой код дает ошибку в

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

Info_button.setOnClickListener(ClickListener);
Какую ошибку? Возможно не тот тип OnClickListener проимпортили.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

v_grechka
Сообщения: 20
Зарегистрирован: 09 авг 2012, 13:30

Re: Урок 66. Диалоги. Обработчики и операции

Сообщение v_grechka » 04 дек 2012, 17:35

В смысле Эклипса подчеркивает как ошибка в коде

Dangreon
Сообщения: 41
Зарегистрирован: 01 янв 2013, 15:52

Re: Урок 66. Диалоги. Обработчики и операции

Сообщение Dangreon » 24 мар 2013, 23:37

v_grechka писал(а):В смысле Эклипса подчеркивает как ошибка в коде
damager все верно говорит, обратите внимание
listener может быть как android.content.DialogInterface.OnClickListener
так и android.view.View.OnClickListener.

А вообще все очень просто реализуется, необходимо лишь явно указать android.view.View.OnClickListener:

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

        android.view.View.OnClickListener myCustomClickListener = new android.view.View.OnClickListener() {
        
        @Override
        public void onClick(View v) {
            Toast.makeText(getApplicationContext(), "Привет медвед!", Toast.LENGTH_SHORT).show();
            
        }
    };

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

Re: Урок 66. Диалоги. Обработчики и операции

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

Хочу элементу диалога присвоить значение

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

public class MainActivity extends Activity {
  /** Called when the activity is first created. */
  final String LOG_TAG = "myLogs";

  LinearLayout view;
  EditText etName;
  final int DIALOG = 1;
  int btn;
  TextView tvName;

  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    tvName = (TextView) findViewById(R.id.tvName);
    setContentView(R.layout.main);
  }

  public void onclick(View v) {
    btn = v.getId();
    showDialog(DIALOG);
  }

  @Override
  protected Dialog onCreateDialog(int id) {
    AlertDialog.Builder adb = new AlertDialog.Builder(this);
    adb.setTitle("Ввод имени");
    // создаем view из dialog.xml
    view = (LinearLayout) getLayoutInflater().inflate(R.layout.dialog,null);
    // устанавливаем ее, как содержимое тела диалога
    adb.setView(view);

// кнопка положительного ответа
    adb.setPositiveButton(R.string.yes, myClickListener);
    // кнопка нейтрального ответа
    adb.setNeutralButton(R.string.cancel,myClickListener);

    // находим EditTex для ввода имени 
    // Или её на данном этапе ещё не существует?
    etName = (EditText) view.findViewById(R.id.etName);
    return adb.create();
  }

  DialogInterface.OnClickListener myClickListener = new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int which) {
      switch (which) {
        // положительная кнопка
        case Dialog.BUTTON_POSITIVE:
          tvName.setText(etName.getText());
          dialog.dismiss();
          break;
        // нейтральная кнопка
        case Dialog.BUTTON_NEUTRAL:
          break;
      }
    }
  };

  @Override
  protected void onPrepareDialog(int id, Dialog dialog) {
    super.onPrepareDialog(id,dialog);

    // получаем доступ к адаптеру списка диалога
    AlertDialog aDialog = (AlertDialog) dialog;

    if (id == DIALOG) {
      etName.setText(tvName.toString());  // Тут ошибка... Точнее ошибки нет, но текст мы не получаем
      Log.d(LOG_TAG, etName.toString());  // В логе вместо строки  DEBUG/myLogs(1858): android.widget.EditText@45ff2cf0
    }
  }
}
но что-то никак не выходит... в комментариях пометил проблему

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

Re: Урок 66. Диалоги. Обработчики и операции

Сообщение Isaev » 25 окт 2013, 10:56

сдаётся мне etName я нахожу не так (или не там)

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

Re: Урок 66. Диалоги. Обработчики и операции

Сообщение Foenix » 25 окт 2013, 22:12

если ошибка, нужно разбираться с логом.
R.id.team

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

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 66. Диалоги. Обработчики и операции

Сообщение KamiSempai » 26 окт 2013, 01:08

tvName.getText().toString()
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

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

Re: Урок 66. Диалоги. Обработчики и операции

Сообщение Isaev » 28 окт 2013, 10:35

а, всё, понял
две строчки местами перепутал :D

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

tvName = (TextView) findViewById(R.id.tvName); 
    setContentView(R.layout.main); 

Аватара пользователя
IgNa
Сообщения: 345
Зарегистрирован: 30 сен 2013, 12:18

Re: Урок 66. Диалоги. Обработчики и операции

Сообщение IgNa » 21 дек 2013, 13:30

То ли я слепой, то ли я тупой... а то ли ни я.
но в этом уроке не сказано как обработать событие - нажатие кнопки Oк
А вообще то полезная и нужная вещь эта кнопка
Изображение

Аватара пользователя
IgNa
Сообщения: 345
Зарегистрирован: 30 сен 2013, 12:18

Re: Урок 66. Диалоги. Обработчики и операции

Сообщение IgNa » 21 дек 2013, 16:17

можно конечно через // обработчик закрытия
приспособиться

но мне кажется это не очень правильно
Изображение

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

Re: Урок 66. Диалоги. Обработчики и операции

Сообщение Foenix » 21 дек 2013, 16:54

IgNa писал(а):То ли я слепой, то ли я тупой... а то ли ни я.
но в этом уроке не сказано как обработать событие - нажатие кнопки Oк
А вообще то полезная и нужная вещь эта кнопка
слепой. Обработчики там показаны.
R.id.team

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

Аватара пользователя
IgNa
Сообщения: 345
Зарегистрирован: 30 сен 2013, 12:18

Re: Урок 66. Диалоги. Обработчики и операции

Сообщение IgNa » 21 дек 2013, 17:56

НУ и какой из предложенных трех, по твоему соответствует нажатию кнопки ОК ?
Изображение

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

Re: Урок 66. Диалоги. Обработчики и операции

Сообщение rezak90 » 21 дек 2013, 20:15

IgNa писал(а):То ли я слепой, то ли я тупой...
самокритика это хорошо
R.id.team
Политика на форуме запрещена

Аватара пользователя
IgNa
Сообщения: 345
Зарегистрирован: 30 сен 2013, 12:18

Re: Урок 66. Диалоги. Обработчики и операции

Сообщение IgNa » 21 дек 2013, 22:01

хорошо - это хорошо..
Изображение

moskir
Сообщения: 1
Зарегистрирован: 27 мар 2014, 14:41

Re: Урок 66. Диалоги. Обработчики и операции

Сообщение moskir » 27 мар 2014, 14:57

Здравствуйте, форумчане.
Помоги, как написать код правильно, в main.xml (из папки layout) там список и кнопка. Список в ArrayList<String> написано в MainActivity.java. Файл added.xml там только EditText для диалоговое окно. в MainActivity список заполненными и нажимаю кнопку New Button, то появляется окно диалоговое и ввожу текст в EditText и кнопка OK для добавления в список в MainActivity. Как реализовывать извлечения текста из EditText в список. Сам разобрался и получается приложение остановлено... Исправить где то в MainActivity в последние строки [syntax=java]OK.putExtra("add_list", edTt.getText().toString());
adapter.add(getIntent().getStringExtra("add_list"));
adapter.notifyDataSetChanged();[/syntax]

main.xml
[syntax=xml]<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<ListView
android:id="@android:id/list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_above="@+id/button" />

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Button"
android:id="@+id/button"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:onClick="onClick" />

</RelativeLayout>
[/syntax]

MainActivity.java
[syntax=java]
import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.EditText;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.Arrays;

public class MainActivity extends ListActivity {

EditText edTt;
Intent OK;

// определяем массив типа String
final String[] catnames = new String[] { "Рыжик", "Барсик", "Мурзик", "Мурка", "Васька",
"Томасина", "Бобик", "Кристина" };

private ArrayAdapter<String> adapter;

private String selectedItem;
private final Context context = this;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

edTt = (EditText) findViewById(R.id.edTt);

OnItemClickListener itemListener = new OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "Вы выбрали " + parent
.getItemAtPosition(position).toString(),Toast.LENGTH_SHORT).show();
}
};

OnItemLongClickListener itemLongListener = new OnItemLongClickListener() {

@Override
public boolean onItemLongClick(AdapterView<?> parent, View v, int position, long id) {
// сохраним выбранный пункт в глобальной переменной
selectedItem = parent.getItemAtPosition(position).toString();

// Build new AlertDialog
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage("Вы хотите удалить " + selectedItem + "?");
builder.setCancelable(false);
builder.setPositiveButton("Да", new DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {
adapter.remove(selectedItem);
adapter.notifyDataSetChanged();
Toast.makeText(getApplicationContext(), selectedItem + " удалён",
Toast.LENGTH_SHORT).show();
}
});
builder.setNegativeButton("Нет", new DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});

// выводим диалоговое окно
builder.show();

return true;
}
};

ArrayList<String> list = new ArrayList<String>(Arrays.asList(catnames));

adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list);

// присваиваем адаптер списку
setListAdapter(adapter);

getListView().setOnItemClickListener(itemListener);
getListView().setOnItemLongClickListener(itemLongListener);
}

public AlertDialog onClick(View v) {
// кнопка "добавить" для появления диалоговое окно на новый предмет в список"
LayoutInflater factory = LayoutInflater.from(this);
final View textEntryView = factory.inflate(R.layout.added, null);
return new AlertDialog.Builder(MainActivity.this)
.setIcon(R.drawable.ic_launcher)
.setTitle(R.string.add_title)
.setMessage(R.string.add_text)
.setView(textEntryView)
.setCancelable(true)
.setPositiveButton(R.string.btnOK, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
OK.putExtra("add_list", edTt.getText().toString());
adapter.add(getIntent().getStringExtra("add_list"));
adapter.notifyDataSetChanged();
Toast.makeText(getApplicationContext(), "123",
Toast.LENGTH_SHORT).show();
}
})
.setNegativeButton("Отмена", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Toast.makeText(getApplicationContext(), "Отмененно",
Toast.LENGTH_SHORT).show();
}
})
.setOnCancelListener(new DialogInterface.OnCancelListener() {
public void onCancel(DialogInterface dialog) {
Toast.makeText(getApplicationContext(), "Отмененно",
Toast.LENGTH_SHORT).show();
}
}).show();
}
}
[/syntax]

added.xml
[syntax=xml]
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/edTt"
android:height="40dp"
android:textSize="20dp"
android:width="250dp"
android:hint="@string/add_txt"
android:layout_centerHorizontal="true" />

</RelativeLayout>[/syntax]

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

Re: Урок 66. Диалоги. Обработчики и операции

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

Подскажите с реализацией через Dialog Fragment
Вот код класса.

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

public class DialogListener extends DialogFragment {
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Log.d("myLogs", "Create");
        AlertDialog dialogListener = new AlertDialog.Builder(getActivity())
        .setTitle(R.string.dialog_listener)
        .setMessage("message")
        .setPositiveButton("ok",null).create();

        dialogListener.setOnShowListener(new DialogInterface.OnShowListener() {
            @Override
            public void onShow(DialogInterface dialog) {
                Log.d("myLogs", "Show");
            }
        });

        return dialogListener;
    }
    @Override
    public void onCancel(DialogInterface dialog) {
        Log.d("myLogs", "Cancel");
    }


    @Override
    public void onDismiss(DialogInterface dialog) {
        Log.d("myLogs", "Dismiss");
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        Log.d("myLogs", "save");
    }
}
Видно, что onCreateDialog отрабатывает каждый раз при открытии диалога, а onSaveInstanceState - ни разу при закрытии или отмене, только при повороте.

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

И в чем разница:

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

public Dialog onCreateDialog(Bundle savedInstanceState) {
        Log.d("myLogs", "Create");
        AlertDialog dialogListener = new AlertDialog.Builder(getActivity())
        .setTitle(R.string.dialog_listener)
        .setMessage("message")
        .setPositiveButton("ok",null).create();

        dialogListener.setOnShowListener(new DialogInterface.OnShowListener() {
            @Override
            public void onShow(DialogInterface dialog) {
                Log.d("myLogs", "Show");
            }
        });

        return dialogListener;
    }
и

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

public Dialog onCreateDialog(Bundle savedInstanceState) {
        Log.d("myLogs", "Create");
        AlertDialog.Builder adb = new AlertDialog.Builder(getActivity())
        .setTitle(R.string.dialog_listener)
        .setMessage("message")
        .setPositiveButton("ok",null).create();

        return adb.create();
    }
Как во втором случае можно повесить слушателя setOnShowListener на этот Диалог?

Павел П
Сообщения: 1
Зарегистрирован: 28 сен 2017, 02:08

Re: Урок 66. Диалоги. Обработчики и операции

Сообщение Павел П » 28 сен 2017, 02:42

REMOVE. При использовании remove из Activity диалог не удаляется, просто Activity про него забывает. Но его можно вызвать через dialog.show(). При следующем вызове через Activity оно его естественно пересоздаст. Это можно использовать при отмене изменений в диалоге для вызова предыдущего состояния.

HIDE. При повторном обращении к диалогу, после использования hide, диалог не проходит через onPrepareDialog, в отличии от cancel и dismiss. Соответственно диалог не обновляется и если бы мы отображали в нем текущее время оно бы, после hide, осталось старым.

Ответить