Урок 66. Диалоги. Обработчики и операции
Урок 66. Диалоги. Обработчики и операции
В этом уроке:
- рассматриваем обработчики событий диалога
- программно закрываем и показываем диалог
[url=http://www.startandroid.ru/ru/uroki/vse ... l:2uz590xo]Click here to read this article![/url:2uz590xo]
- рассматриваем обработчики событий диалога
- программно закрываем и показываем диалог
[url=http://www.startandroid.ru/ru/uroki/vse ... l:2uz590xo]Click here to read this article![/url:2uz590xo]
Последний раз редактировалось damager82 12 май 2017, 11:57, всего редактировалось 5 раз.
Re: Урок 66. Диалоги. Обработчики и операции
можно было для метода hide() добавить к сравнению метод show();
и собственно визуально это работает одинаково:
и собственно визуально это работает одинаково:
Код: Выделить всё
void method1() {
dismissDialog(DIALOG);
//или
removeDialog(DIALOG);
//или
dialog.dismiss();
//или
dialog.hide();
}
void method2() {
showDialog(DIALOG);
//или
dialog.show();
}
Re: Урок 66. Диалоги. Обработчики и операции
А можно ли в кастомный диалог добавить кнопку и прописать на ней событие?
Вот такой код дает ошибку в
Или настроить одну из кнопок диалога так, чтобы она не закрывала диалог, а производила какие-то действия на форме диалога?
Код: Выделить всё
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. Диалоги. Обработчики и операции
Какую ошибку? Возможно не тот тип OnClickListener проимпортили.v_grechka писал(а):Вот такой код дает ошибку вКод: Выделить всё
Info_button.setOnClickListener(ClickListener);
Re: Урок 66. Диалоги. Обработчики и операции
В смысле Эклипса подчеркивает как ошибка в коде
Re: Урок 66. Диалоги. Обработчики и операции
damager все верно говорит, обратите вниманиеv_grechka писал(а):В смысле Эклипса подчеркивает как ошибка в коде
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. Диалоги. Обработчики и операции
Хочу элементу диалога присвоить значение
но что-то никак не выходит... в комментариях пометил проблему
Код: Выделить всё
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. Диалоги. Обработчики и операции
сдаётся мне etName я нахожу не так (или не там)
Re: Урок 66. Диалоги. Обработчики и операции
если ошибка, нужно разбираться с логом.
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Урок 66. Диалоги. Обработчики и операции
tvName.getText().toString()
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Урок 66. Диалоги. Обработчики и операции
а, всё, понял
две строчки местами перепутал
две строчки местами перепутал
Код: Выделить всё
tvName = (TextView) findViewById(R.id.tvName);
setContentView(R.layout.main);
Re: Урок 66. Диалоги. Обработчики и операции
То ли я слепой, то ли я тупой... а то ли ни я.
но в этом уроке не сказано как обработать событие - нажатие кнопки Oк
А вообще то полезная и нужная вещь эта кнопка
но в этом уроке не сказано как обработать событие - нажатие кнопки Oк
А вообще то полезная и нужная вещь эта кнопка
Re: Урок 66. Диалоги. Обработчики и операции
можно конечно через // обработчик закрытия
приспособиться
но мне кажется это не очень правильно
приспособиться
но мне кажется это не очень правильно
Re: Урок 66. Диалоги. Обработчики и операции
слепой. Обработчики там показаны.IgNa писал(а):То ли я слепой, то ли я тупой... а то ли ни я.
но в этом уроке не сказано как обработать событие - нажатие кнопки Oк
А вообще то полезная и нужная вещь эта кнопка
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
Re: Урок 66. Диалоги. Обработчики и операции
НУ и какой из предложенных трех, по твоему соответствует нажатию кнопки ОК ?
Re: Урок 66. Диалоги. Обработчики и операции
самокритика это хорошоIgNa писал(а):То ли я слепой, то ли я тупой...
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 66. Диалоги. Обработчики и операции
хорошо - это хорошо..
Re: Урок 66. Диалоги. Обработчики и операции
Здравствуйте, форумчане.
Помоги, как написать код правильно, в 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]
Помоги, как написать код правильно, в 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. Диалоги. Обработчики и операции
Подскажите с реализацией через Dialog Fragment
Вот код класса.
Видно, что onCreateDialog отрабатывает каждый раз при открытии диалога, а onSaveInstanceState - ни разу при закрытии или отмене, только при повороте.
Как можно в этом случае сохранять какие-либо данные (переменную, например) при закрытии и потом передавать ее обратно в диалог при повторном создании?
И в чем разница:
и
Как во втором случае можно повесить слушателя setOnShowListener на этот Диалог?
Вот код класса.
Код: Выделить всё
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");
}
}
Как можно в этом случае сохранять какие-либо данные (переменную, например) при закрытии и потом передавать ее обратно в диалог при повторном создании?
И в чем разница:
Код: Выделить всё
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();
}
Re: Урок 66. Диалоги. Обработчики и операции
REMOVE. При использовании remove из Activity диалог не удаляется, просто Activity про него забывает. Но его можно вызвать через dialog.show(). При следующем вызове через Activity оно его естественно пересоздаст. Это можно использовать при отмене изменений в диалоге для вызова предыдущего состояния.
HIDE. При повторном обращении к диалогу, после использования hide, диалог не проходит через onPrepareDialog, в отличии от cancel и dismiss. Соответственно диалог не обновляется и если бы мы отображали в нем текущее время оно бы, после hide, осталось старым.
HIDE. При повторном обращении к диалогу, после использования hide, диалог не проходит через onPrepareDialog, в отличии от cancel и dismiss. Соответственно диалог не обновляется и если бы мы отображали в нем текущее время оно бы, после hide, осталось старым.