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

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

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

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

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

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

Добавлено: 23 окт 2012, 19:20
gera
можно было для метода hide() добавить к сравнению метод show();

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

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

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

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

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

Добавлено: 30 ноя 2012, 10:17
v_grechka
А можно ли в кастомный диалог добавить кнопку и прописать на ней событие?

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

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);
Или настроить одну из кнопок диалога так, чтобы она не закрывала диалог, а производила какие-то действия на форме диалога?

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

Добавлено: 30 ноя 2012, 16:16
damager82
v_grechka писал(а):Вот такой код дает ошибку в

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

Info_button.setOnClickListener(ClickListener);
Какую ошибку? Возможно не тот тип OnClickListener проимпортили.

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

Добавлено: 04 дек 2012, 17:35
v_grechka
В смысле Эклипса подчеркивает как ошибка в коде

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

Добавлено: 24 мар 2013, 23:37
Dangreon
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();
            
        }
    };

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

Добавлено: 24 окт 2013, 14:34
Isaev
Хочу элементу диалога присвоить значение

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

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
    }
  }
}
но что-то никак не выходит... в комментариях пометил проблему

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

Добавлено: 25 окт 2013, 10:56
Isaev
сдаётся мне etName я нахожу не так (или не там)

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

Добавлено: 25 окт 2013, 22:12
Foenix
если ошибка, нужно разбираться с логом.

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

Добавлено: 26 окт 2013, 01:08
KamiSempai
tvName.getText().toString()

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

Добавлено: 28 окт 2013, 10:35
Isaev
а, всё, понял
две строчки местами перепутал :D

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

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

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

Добавлено: 21 дек 2013, 13:30
IgNa
То ли я слепой, то ли я тупой... а то ли ни я.
но в этом уроке не сказано как обработать событие - нажатие кнопки Oк
А вообще то полезная и нужная вещь эта кнопка

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

Добавлено: 21 дек 2013, 16:17
IgNa
можно конечно через // обработчик закрытия
приспособиться

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

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

Добавлено: 21 дек 2013, 16:54
Foenix
IgNa писал(а):То ли я слепой, то ли я тупой... а то ли ни я.
но в этом уроке не сказано как обработать событие - нажатие кнопки Oк
А вообще то полезная и нужная вещь эта кнопка
слепой. Обработчики там показаны.

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

Добавлено: 21 дек 2013, 17:56
IgNa
НУ и какой из предложенных трех, по твоему соответствует нажатию кнопки ОК ?

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

Добавлено: 21 дек 2013, 20:15
rezak90
IgNa писал(а):То ли я слепой, то ли я тупой...
самокритика это хорошо

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

Добавлено: 21 дек 2013, 22:01
IgNa
хорошо - это хорошо..

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

Добавлено: 27 мар 2014, 14:57
moskir
Здравствуйте, форумчане.
Помоги, как написать код правильно, в 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]

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

Добавлено: 03 ноя 2016, 15:19
pl--alex
Подскажите с реализацией через 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 на этот Диалог?

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

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

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